这是我一直试图解决的调试问题。我知道我需要应用的位掩码才能使b
等于a
。我检查了gdb,找出了a
和b
之间的区别。变量b
和a
是char[]
类型,并在到达'bug'之前设置。
#include <string.h>
int main() {
char a[1] = "a";
char b[1] = "b";
int *x;
x = (int *) b;
// bug in next line
*x = *x & 0xffffffff;
return memcmp(a, b, 1);
}
在a
等于b
之前,我无法解决问题。给出的唯一约束是错误位于注明的行中,不会更改其他代码。没有规则说我不能在bug之后添加行,但是在memcmp()
之前。我发现的问题是我对bit掩码所做的任何事都不会改变b的值。我在错误之前和之后设置了断点并检查了x
和*x
的值,但x
似乎没有改变。
Breakpoint 1, main () at test.c:9
9 *x = *x & 0xffffffff;
(gdb) print (int) a
$1 = -6922
(gdb) print (int) b
$2 = -6921
(gdb) print (int) x
$3 = -6921
(gdb) step
Breakpoint 2, main () at test.c:10
10 return memcmp(a, b, 1);
(gdb) print (int) a
$4 = -6922
(gdb) print (int) b
$5 = -6921
(gdb) print (int) x
$6 = -6921
通过修改bug所在的行中的常量,我看不出如何通过请求的方式解决这个问题。任何有助于了解如何使用x
使用按位掩码更新b
的帮助将不胜感激。
答案 0 :(得分:1)
您正在尝试更改b
的地址,但在
*x = *x & 0xffffffff;
您正在更改该值,因为您要取消引用x
。你需要将操作应用于x
本身,如
x = x & 0xffffffff;
然后你需要将x重新分配给b。
这将与strict aliasing rules发生冲突。
答案 1 :(得分:1)
x
是一个指针;将其转换为int
只会将地址作为十进制数字。
a
和b
都是数组,当您执行需要指针的操作时,它会衰减为指针。通过将它们转换为int
,您将再次获取变量的地址。即使该地址的内容发生变化,地址也不会随着您正在执行的操作而改变。
由于a
和b
都小于int
,因此您的代码可能会以非常痛苦的方式陷入困境。即使尺寸合适,也不能保证做正确的事。