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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Кто может проверить работу gcc на свежеобновленном Linux? 10.11.14 13:10  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 10.11.14 17:27  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
У меня gcc из MinGW при сборке под x86_32 в функции printf портит старшее DWORD, а что выдает вот такой оператор в Linux?:
printf("test_val=%*llx", 0xffffffffffffffff);
Что значит "портит" если не хватает второго аргумента, а... 10.11.14 17:26  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> У меня gcc из MinGW в функции printf портит старшее DWORD,
> а что выдает вот такой оператор в Linux?:
> printf("test_val=%*llx",> 0xffffffffffffffff);

Что значит "портит" если не хватает второго аргумента, а разрядность первого не определена?
Почему же не определена? 10.11.14 17:31  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Что значит "портит" если не хватает второго аргумента, а
> разрядность первого не определена?

Почему же не определена?
Две "L" после звездочки означают "long long int", а "x" - шестнадцатеричное представление.
http://www.cplusplus.com/reference/cstdio/printf/
Собираю под 32-битную платформу. Под 64 битную пока не проверял.
Для формата в printf - да, а для аргумента... 10.11.14 20:55  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> > Что значит "портит" если не хватает второго аргумента,
> а
> > разрядность первого не определена?
>
> Почему же не определена?
> Две "L" после звездочки означают "long long int", а "x" -
> шестнадцатеричное представление.
> http://www.cplusplus.com/reference/cstdio/printf/
> Собираю под 32-битную платформу. Под 64 битную пока не
> проверял.

Для формата в printf - да, а для аргумента 0xffffffffffffffff - нет.
gcc и clang всех не дремучих версий при -fWall тут выдадут два предупреждения: про нарушение типа аргумента для %* (нужен int, а не long), и про отсутствие данных/аргумента для %llx.
Сюда я закинул уже вырожденный пример. [upd] 11.11.14 09:34  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 11.11.14 14:15  Количество правок: 2
<"чистая" ссылка> <обсуждение закрыто>
> Для формата в printf - да, а для аргумента
> 0xffffffffffffffff - нет.
> gcc и clang всех не дремучих версий при -fWall тут выдадут
> два предупреждения: про нарушение типа аргумента для %*
> (нужен int, а не long), и про отсутствие данных/аргумента
> для %llx.

Сюда я закинул уже вырожденный пример. Естественно, что наткнулся я на этот "баг" используя в качестве параметра переменную "unsigned long long int". Результат идентичен.

P.S. Убрал "звёздочку" - заработало.

[upd]
Сдается мне, что printf воспринимает абсолютно все переданные параметры (включая строку формата), как массив символов, а далее идет парсинг строки формата и на основе данных этой строки разгребаются все остальные параметры в пределах кадра стека.
см. https://ru.wikipedia.org/wiki/Stdarg.h 11.11.14 15:45  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
> Сюда я закинул уже вырожденный пример. Естественно, что
> наткнулся я на этот "баг" используя в качестве параметра
> переменную "unsigned long long int". Результат идентичен.
>
> P.S. Убрал "звёздочку" - заработало.
>
> [upd]
> Сдается мне, что printf воспринимает абсолютно все
> переданные параметры (включая строку формата), как массив
> символов, а далее идет парсинг строки формата и на основе
> данных этой строки разгребаются все остальные параметры в
> пределах кадра стека.

см. https://ru.wikipedia.org/wiki/Stdarg.h

printf использует va_start/va_end для вызова vprintf.
в свою очередь vprintf использует va_arg для "листания" переданных на стеке параметров согласно спецификации формата.
сама строка формата размещается просто как массив символов с 0 на конце и передается первым параметром в виде указателя на первый элемент массива.

в "плюшевых" языках типа python, С# и т.п. параметры передаются в виде объектов, которые в частности знают свой тип, см например google + box unbox c#
Ну да! Глянь пример по своей ссылке на stdarg.h 13.11.14 09:03  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
Так и не понял о чем вы спрашивали и что отвечали. 19.11.14 12:34  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Так и не понял о чем вы спрашивали и что отвечали.

va_start/va_arg/va_end работают с аргументами на стеке согласно "C calling conversion" и ABI (Application Binary Interface) для конкретной платформы/компилятора.

В printf после убирания "звездочки" заработало потому, что сама "звездочка" требует аргумента на стека (который определяет необходимую "ширину" вывода).
С этим всё предельно понятно. Первый аргумент - строка... 19.11.14 14:02  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 19.11.14 14:03  Количество правок: 1
<"чистая" ссылка> <обсуждение закрыто>
> Так и не понял о чем вы спрашивали и что отвечали.
>
> va_start/va_arg/va_end работают с аргументами на стеке
> согласно "C calling conversion" и ABI (Application Binary
> Interface) для конкретной платформы/компилятора.

С этим всё предельно понятно. Первый аргумент - строка формата, описывающая последовательность и размеры передаваемых в этом же кадре стека аргументов, значения которых используются при выводе на печать.

> В printf после убирания "звездочки" заработало потому, что
> сама "звездочка" требует аргумента на стека (который
> определяет необходимую "ширину" вывода).

"Звездочка" стоит в позиции, отвечающей за минимальное количество выводимых на печать символов.
(number) - "Minimum number of characters to be printed. If the value to be printed is shorter than this number, the result is padded with blank spaces. The value is not truncated even if the result is larger."
* - "The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted."
Если я правильно понимаю написанное:
Ширина не указана в строке формата, но как дополнительный аргумент целочисленного значения, предшествующий аргументу, который должен быть отформатирован.
Этот параметр нужен для резервирования минимального количества символов печатаемого аргумента, чтобы поддерживать стабильную ширину (например при выводе табличных данных на консоль). То есть не важно, какого размера в стеке аргумент, т.к. размер в стеке аргумента определяется следующими символами (в моем случае "ll" - long long).
На мой взгляд, наличие или отсутствие "звёздочки", в данном случае, никак не должны были влиять на выводимый аргумент, но наличие "звёздочки" толи портит старшее DWORD аргумента, толи сдвигает на DWORD указатель на аргумент.

Может я что-то не правильно понял?
printf("%5i", 3) === printf("%*i", 5, 3) 19.11.14 15:46  
Автор: leo <Леонид Юрьев> Статус: Elderman
<"чистая" ссылка> <обсуждение закрыто>
Ах вон оно как... Спасибо! 20.11.14 08:57  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка> <обсуждение закрыто>
1




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


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