Какая была самая опасная ошибка программирования, которую вы допустили в C? - PullRequest
8 голосов
/ 12 ноября 2008

Я программист среднего уровня. Если вы допустили какую-либо ошибку в коде, о которой позже узнали, что она наиболее опасна / вредна для всего приложения, поделитесь этим кодом или описанием. Я хочу знать это, потому что в будущем я могу столкнуться с такими ситуациями, и я хочу получить ваш совет, чтобы избежать таких ошибок.

Ответы [ 26 ]

3 голосов
/ 12 ноября 2008

Вы должны больше беспокоиться о маленьких ошибках. Большие / зрелищные ошибки обычно документируются в книгах (с причинами, по которым они плохие, альтернативные подходы и т. Д.).

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

Поэтому я советую попробовать и прочитать книги, написанные или написанные Керниганом («Язык программирования C», «Практика программирования» и т. Д.), Потому что они полны здравого смысла (обычного для опытных программистов на C). советы и список принципов, которые очень полезны для избежания как мелких, так и больших ошибок.

Они также перечисляют много потенциальных больших ошибок, поэтому они отвечают на ваш первоначальный вопрос.

2 голосов
/ 12 ноября 2008
while(a)
{ 
   // code - where 'a' never reaches 0 :( 
}
2 голосов
/ 12 ноября 2008

Когда указатель назначается впервые, у него нет указателя.

Указатель "неинициализирован"

Операция разыменования неверного указателя является серьезной ошибкой во время выполнения.

Если вам повезет, операция разыменования немедленно завершится сбоем или остановится (Java ведет себя так путь).

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

2 голосов
/ 14 ноября 2008

Две вещи приходят на ум. Сначала это была функция во встроенном C (MCU). Я пытался установить некоторые ограничения на значение таймера при вводе функции. так я написал

if(55000 < my_var < 65000)

Мой ида должен был проверить вот так:

if( (55000<my_var) < 65000)

Но это эквивалент или результат

if( (55000<my_var) || (my_var<65000))

и в итоге результат if был всегда верным.

Звук был ошибкой указателя. (просто здесь представлено)

get_data(BYTE **dataptr)
{ 
  ubyte* data = malloc(10);
  ... code ...
  *dataptr = &data[1];
}

 main()
 {
   BYTE *data
   get_data(&data);
   free(data);
 }

Это приводит к потере 1 байта памяти при каждом вызове функции get_data()

.
1 голос
/ 12 ноября 2008

Передача виртуального адреса в механизм DMA была наихудшей, не совсем связанной с C, но я предполагаю, что 99% связанных с DMA вещей написаны на C, так что это своего рода соответствие Эта небольшая ошибка привела к повреждению памяти, которое заняло у меня 1,5 месяца.

1 голос
/ 12 ноября 2008

Использование неограниченных строковых функций, таких как strcpy () или strcmp (), вместо безопасных версий, например strncpy () и strncmp ().

1 голос
/ 12 ноября 2008

корпус переключателя без перерывов.

1 голос
/ 11 ноября 2010

Это известный исторический пример (не то, что я сделал), но

double d;      // d gets populated with a large number from somewhere
short s = d ;  // overflow

привело к взрыву и полной потере из ракеты Ariane V .

1 голос
/ 26 ноября 2008

Забывание архитектурных ограничений и счастливое memcpy () в области ввода-вывода с отображением в памяти на микроконтроллере. Волшебный дым был выпущен из испытательного стенда.

1 голос
/ 08 декабря 2008

Я имел дело с динамически размещаемыми двумерными массивами, и вместо того, чтобы освободить () N строк, я решил освободить M столбцов. Это было хорошо для небольших входов, где N == M, но на больших входах я освобождаю () только 50% от того, что я выделил.

пожав плечами

Живи и учись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...