2017-01-08 17 views
0

У меня возникает неизвестная и резкая ошибка сегментации при запуске моего кода в AIX. Следующая строка:AIX: Неизвестный вопрос об ошибке сегментации

sourceSample +=value; 

дает ошибку сегментации. Здесь sourceSample - это указатель, который указывает на изображение.

Я сделал некоторые изменения в строке выше кода и происходит следующее: ошибка

  1. int *p = sourceSample; sourceSample = p + value; Сегментация сохраняется.

  2. int **p = &sourceSample; sourceSample = *p + value; Отсутствие ошибки сегментации, и код выполняется успешно.

Может ли кто-нибудь сказать мне, почему это происходит?

ps: Это мой первый вопрос о StackOverflow, так что простите меня, если я пропустил что-нибудь.

+1

Вещь, которую вы пропустили, размещала всю соответствующую выдержку из вашего кода, что позволяет нам воспроизвести проблему. См. Также: [MCVE] –

+0

Знаете ли вы (а) то, что пытается сделать исходная исходная строка, и (б) какие именно изменения вы сделали * на самом деле означает * и как они отличаются? Если нет, я дам вам знать сейчас: * угадывание * это * не * как вы учитесь программировать. – WhozCraig

+1

Единственный способ получить ошибку сегментации от программы на C++, выполняющейся на соответствующей реализации C++, - это показать, что эта программа демонстрирует неопределенное поведение. Нам понадобится [mcve], чтобы определить природу неопределенности, но правдоподобной возможностью является то, что 'sourceSample + value' будет указывать за пределы объекта, в который указывают« sourceSample ». Попытка вычислить такое значение указателя достаточно для создания неопределенного поведения; вы технически не нуждаетесь в разыменовании результата. –

ответ

0

Я нашел проблему. Проблема связана с неправильным созданием кода сборки в AIX. Ошибки сегментации происходит, когда он пытается получить доступ к sourceSample после добавления значения «» к нему с помощью:

if(bitPos == bitPos_renew) { 
    sourceSample += value; 
} 

Когда «значение» добавляется к указателю sourceSample и sourceSample попытке доступа, AIX вызывает ошибку сегментации. Это связано с неправильным значением в переменной «значение».

Значение «значение» присваивается с помощью:

value = sx <= ex ? 1 : -1; 

Значение, присвоенное ему должно быть 1 или -1, но когда мы видим в коде сборки значение, присвоенное 64-битных регистра со ссылкой на переменную ' значение»является

00000000FFFFFFFF

и не

FFFFFFFFFFFFFFFF (-1)

Из-за этого, когда «значение» добавляется к sourceSample, он начинает указывая на какой-то нераспределенному памяти, вызывая ошибку сегментации.

Когда я пытаюсь напечатать значение переменной «значение», код сборки будет автоматически и успешно выполнен.

Это связано с оптимизацией компилятора. Если я удалю все оптимизации, установив уровень оптимизации на O0, код сборки полностью прекрасен, и нет ошибки сегментации.