Оптимизация компилятора приводит к сбою программы

Я пишу программу на С++/Qt, которая содержит парсер графических файлов. Я использую g++для компиляции проекта.

Во время разработки я постоянно сравниваю производительность моего низкоуровневого синтаксического анализатора между различными флагами компилятора в отношении информации об оптимизации и отладке, а также флагом отладки Qt (, включающим/выключающим qDebug ()и Q _ASSERT ()).

Теперь я столкнулся с проблемой, когда единственная правильно работающая сборка — это сборка без какой-либо оптимизации . Все остальные версии, даже с -O1, похоже, работают по-другому. Они падают из-за неудовлетворенных утверждений, которые выполняются при компиляции без флага -O.... Код не выдает никаких предупреждений компилятора, даже с -Wall.

Я очень уверен, что в моей программе есть ошибка, которая кажется вредной только при включенной оптимизации. Проблема в том, что :я не могу найти его даже при отладке программы. Парсер, кажется, читает неправильные данные из файла. Когда я запускаю несколько простых тестов, они работают отлично. Когда я запускаю более крупный тестовый пример (расчет маршрута на графе, считанном непосредственно из файла ), в файле происходит неправильное чтение, которое я не могу объяснить.

Где я должен начать отслеживать проблему этого неопределенного поведения? Какие методы оптимизации, возможно, связаны с этим различным поведением?(Я мог бы включить все флаги один за другим, но я знаю не так уж много флагов компилятора, кроме -O..., и я знаю, что их много, так что это заняло бы очень много времени. )Как только я узнаю, к какому типу относится ошибка, я уверен, что рано или поздно найду ее.

Вы можете мне очень помочь, если скажете, какие методы оптимизации компилятора являются возможными кандидатами для таких проблем.

5
задан leemes 11 July 2012 в 00:15
поделиться