Это проблема отладки, которую я пытался решить. Я знаю, что нужно использовать битовую маску, чтобы сделать b
равным a
. Я проверил с gdb, чтобы найти разницу между a
и b
. Переменные b
и a
являются char[]
типами и устанавливаются перед достижением «ошибки».указатель на переменную не обновляет переменную при разыменовании
#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
, я не могу решить эту проблему. Единственное ограничение состоит в том, что ошибка указана в строке, другой код не должен быть изменен. Не существует правила, говорящего, что я не могу добавить строки после ошибки, хотя и до memcmp()
. Проблема, которую я нахожу, заключается в том, что ничего, что я делаю с битовой маской, не изменяет значение 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
Я не вижу, как это можно решить по желанию, путем изменения константы в строке, где находится ошибка. Любая помощь, чтобы понять, как использовать x
для обновления b
с использованием побитовой маски, будет оценена по достоинству.
Как вы отметили C++: не используйте C-style casts. В этом случае вам нужно будет использовать 'reinterpret_cast' для компиляции. Всякий раз, когда вы используете это ключевое слово и не знаете, почему это безопасно, код следует считать ошибочным! –
Я не верю твоему праву. Выход из отладчика несовместим с кодом. –
правильный, это был пример, я превратился в минимальный, полный пример. поэтому показанные целочисленные значения не являются репрезентативными для действительных значений «a» и «b» и т. д. –