Что может вызвать код C для взлома sh, когда массив инициализируется при объявлении, но не для взлома sh, если обнулен al oop? - PullRequest
2 голосов
/ 08 марта 2020

Недавно в проекте, над которым я работаю, была исправлена ​​ошибка, но до сих пор никто не смог объяснить, почему исправление работает. (Так это действительно исправление?) Код работает в пространстве ядра в системе реального времени, поэтому проблема вызывает полную блокировку системы. Это делает отладку сложнее, чем обычно.

В этой версии происходит сбой системы:

int  dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};

Эта версия не поддерживает sh

int  dups[EMCMOT_MAX_AXIS];
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int  i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}

Чтобы запутать ситуацию, эта экспериментальная версия также дает сбой

int  dups[EMCMOT_MAX_AXIS] = {0};
char *coords = coordinates;
char coord_letter[] = {'X','Y','Z','A','B','C','U','V','W'};
int  i;
for (i=0; i<EMCMOT_MAX_AXIS; i++) {dups[i] = 0;}

Вы можете увидеть коммит и окружающий код здесь: https://github.com/LinuxCNC/linuxcnc/commit/ef6f36a16c7789af258d34adf4840d965f4c0b10

1 Ответ

2 голосов
/ 10 марта 2020

Спасибо Nate Eldredge за настройку компилятора и 0andriy за указатель %xmm0. Это похоже на проблему с компилятором, использующим небезопасный регистр для кода ядра (или некоторую тесно связанную проблему). Экспериментируя с сайтом Godbolt, я смог обнаружить, что флаг компилятора -mno-sse2 имеет тот же эффект, что и переключение на g cc -6 при удалении использования регистра $xmm0 в этом коде. И, когда он добавлен к флагам компилятора в фактической компиляции приложения, это, похоже, решает проблему. Вероятно, потребуется еще немного работы, чтобы добраться до сути решения right , но у нас сейчас есть несколько хороших указателей.

...