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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Стандартные C-шные числовые литералы 05.10.05 11:51  Число просмотров: 1817
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
#include "stdio.h"

void
main() {
	printf("%d\t%d\t%d\n", 10, 0x10, 010);
}

---

Так как cmd.exe скорее всего написан на C, и числа соответственно читаются чем нибудь вроде scanf-а (или atoi если число в текстовом предварительно считано в память), то и их интерпретация сишная
<site updates>
Баг в командном процессоре cmd.exe 04.10.05 20:19  
Publisher: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Обработка чисел с лидирующими нулями в командном процессоре cmd.exe
Den http://www.bugtraq.ru/cgi-bin/iforum.mcgi?type=si&u=5269

Случайно обнаружился интересный глюк в cmd.exe на MS Windows 2000 Server, проявляющийся при попытке произвести арифметическую операцию с двузначными и более числами, предваренными лидирующими нолями, с последующим присвоением переменной окружения.

Попробуйте:
set /a test=0054-1
set /a test=0111
set /a test=4*0110

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

Причина - правила интерпретации числовых констант, которые могут быть либо десятичными (17), либо шестнадцатиричными (0x11), либо восьмиричными (021).

WORKAROUND:
Глюка можно обойти, если использовать следующее выражение для отбрасывания лидирующих нолей:
for /F "tokens=* delims=0" %i in ("0110") do set /a test=4*%i


Полный текст
И не только в win2000, также "прекрасно" работает и в ХР :-) 12.10.05 14:09  
Автор: Nemetc Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Стандартные C-шные числовые литералы 05.10.05 11:51  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
#include "stdio.h"

void
main() {
	printf("%d\t%d\t%d\n", 10, 0x10, 010);
}

---

Так как cmd.exe скорее всего написан на C, и числа соответственно читаются чем нибудь вроде scanf-а (или atoi если число в текстовом предварительно считано в память), то и их интерпретация сишная
Спасибо. Уже понял где собака M$ порылась. 05.10.05 12:57  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Если бы M$ об этом в виндовом хелпе упомянули или прочел бы я set /? внимательнее, то не попался бы на эту удочку.
грохаю? 04.10.05 22:42  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
Это скорее стоит оформить как текст в faq, для новостной ленты не очень подходит.
Зачем грохать? ИМХО, лучше тогда уж переместить, например, в sysadmin или operating systems. 04.10.05 22:47  
Автор: fly4life <Александр Кузнецов> Статус: Elderman
Отредактировано 04.10.05 22:53  Количество правок: 2
<"чистая" ссылка>
> Это скорее стоит оформить как текст в faq, для новостной
> ленты не очень подходит.

Ну, и в ФАК тоже конечно можно, с поправкой, сделанной ds
Правда, не знаю насколько сей вопрос - 'frequently' ;)
я не про форум, я про ленту, куда это ушло 04.10.05 22:53  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
А frequently или не очень - это дело субъективное, главное, что может пригодиться другим, на это напоровшимся.
А про ленту ты ещё и спрашиваешь?! ;) 04.10.05 22:55  
Автор: fly4life <Александр Кузнецов> Статус: Elderman
<"чистая" ссылка>
я человек щепетильный :) перенес в FAQ 04.10.05 23:09  
Автор: dl <Dmitry Leonov>
Отредактировано 04.10.05 23:14  Количество правок: 1
<"чистая" ссылка>
Наверное, лучше в sysadmin перенести. 05.10.05 12:43  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Это не баг, не глюк, а фича: 04.10.05 22:38  
Автор: ds Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> Баг в командном процессоре cmd.exe
>
>
>
> Случайно обнаружился интересный глюк в cmd.exe на MS
> Windows 2000 Server, проявляющийся при попытке произвести
> арифметическую операцию с двузначными и более числами,
> предваренными лидирующими нолями, с последующим присвоением
> переменной окружения.

Это не баг, не глюк, а фича:
С:\>set /a test=008
Invalid number.  Numeric constants are either decimal (17),
hexadecimal (0x11), or octal (021).

---
Нифига себе фича!... :)) Ты когда последний раз пользовался восьмеричным исчислением? 05.10.05 12:40  
Автор: Den <Denis> Статус: The Elderman
Отредактировано 05.10.05 12:58  Количество правок: 1
<"чистая" ссылка>
Попался на это при конвертировании даты.
Частенько пользуюсь. chmod 644 например 06.10.05 13:19  
Автор: :-) <:-)> Статус: Elderman
<"чистая" ссылка>
В 88-м году! На Электронике-60 Бэйсик запускал по 8-ричному адресу. 06.10.05 04:07  
Автор: Zef <Alloo Zef> Статус: Elderman
<"чистая" ссылка>
Ух ты! Это ж вот, недавно было! ;) 06.10.05 12:13  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
Warkaround в догонку. 04.10.05 21:20  
Автор: Den <Denis> Статус: The Elderman
<"чистая" ссылка>
> WORKAROUND:

> Глюка можно обойти, если использовать следующее выражение
> для отбрасывания лидирующих нолей:

> for /F "tokens=* delims=0" %i in ("0110") do call set /a
> test=4*%i

В команде for ... do ... не обязательно ставить call, так тоже работает.
for /F "tokens=* delims=0" %i in ("0110") do set /a test=4*%i
1




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


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