информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetПортрет посетителя
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Вот прикол :) 02.06.01 12:43  
Автор: PS <PS> Статус: Elderman
<"чистая" ссылка>
Итак, скачал я из инета модуль подщета CRC. Там есть такая строчка:

unsigned char* buffer;
ULONG ulCRC;
ulCRC = (ulCRC >> 8) ^ crc32_table[(ulCRC & 0xFF) ^ *buffer++];

Вроде все правильно. Но при различной компиляции, то корректно работает, но нет. Что такое ? Начал разбираться... Оказывается компилятор в зависимости от какого-то своего внутреннего мусора приводит код ((ulCRC & 0xFF) ^ *buffer++) к различному типу ! У него это то char то long. Убереш printf в начале любого файла - char, поставишь - long :))) Весело, однако :)

Проблемма решается небольшой заменой:
ulCRC = (ulCRC >> 8) ^ crc32_table[((ulCRC ^(*buffer)) & 0xFF)];

Выводы:
1. Код в инете не оттестирован. К нему надо относится очень осторожно.
2. На разных компиляторах можно получить разную работу одного и того же кода.
3. Неявное приведение типа - вещь очень скользкая.

Все это давно известно, но думаю есть еще люди которым этот опыт может принести пользу.
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach