2012-09-25 1 views
1

Я в очень странной ситуации, когда мой код работает на моем рабочем столе, но падает на удаленном кластере. Я потратил бесчисленное количество раз, проверяя код моего кода на ошибки, запуская его в отладчике, чтобы поймать, что нарушает код, и ищет утечки памяти под valgrind (который оказался чистым - по крайней мере, под gcc).Что означает, когда один и тот же исходный код дает разные ответы в двух разных компиляторах?

В конечном итоге то, что я выяснил до сих пор, заключается в том, что тот же исходный код производит одинаковые на обеих машинах, если я использую один и тот же компилятор (gcc 4.4.5). Проблема в том, что я хочу использовать компилятор Intel в удаленном кластере для улучшения производительности, а также некоторые готовые библиотеки, которые используют intel. Кроме того, я все еще беспокоюсь, что, возможно, gcc пренебрегает некоторыми проблемами памяти, которые попадают в компилятор Intel.

Что это значит для моего кода?

+0

Можете ли вы показать нам какой-нибудь код? Может быть, ошибка очевидна для некоторых из нас. – fredoverflow

+0

Я бы, к сожалению, имел большой проект с несколькими файлами, и я понятия не имею, откуда это может произойти. Есть ли анализатор кода, который может предложить возможные неопределенные действия? – GradGuy

+0

Напишите модульные тесты. –

ответ

4

Возможно, вы полагаетесь на undefined, unspecified or implementation-defined behavior.

Возможно, вы забыли инициализировать переменную или получить доступ к массиву за пределами допустимых границ, или в вашем коде есть выражения типа a[i] = b[i++] ... возможности практически бесконечны.

+0

Как их найти? Любой инструмент, который вы бы предложили? – GradGuy

+1

Для дополнительной справки [этот вопрос] (http://stackoverflow.com/questions/367633/what-are-all-the-common-undefined-behaviour-that-ac-programmer-should-know-ab) перечислены количество общих источников неопределенного поведения. – chris

+0

@GradGuy Вы можете использовать Valgrind для обнаружения использования неинициализированных значений или доступа к неверным адресам памяти. – petersohn

0

Возникла ли авария в файле ядра? Если обратные трассировки, эквивалентные команде gdb 'bt', из нескольких дампов ядра согласованы, то вы можете начать вводить инструкции printf выборочно и работать назад по списку функций в трассировке стека.

Если обнаружены утечки памяти, тогда куча, вероятно, все в порядке. Это оставляет стек потенциальной проблемной областью. Похоже, у вас может быть неинициализированная переменная, которая разбивает стек.

Попробуйте компилировать приложение с помощью «-fstack-protector», включенного в ваши аргументы команды компиляции gcc/g ++.