информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetГде водятся OGRыВсе любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Microsoft обещает радикально усилить... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / site updates
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Наверное, лучше в sysadmin перенести. 05.10.05 12:43  Число просмотров: 1682
Автор: Den <Денис Т.> Статус: The Elderman
<"чистая" ссылка>
<site updates>
Баг в командном процессоре cmd.exe 04.10.05 20:19  
Publisher: Den <Денис Т.> Статус: 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 <Денис Т.> Статус: 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 <Денис Т.> Статус: 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 <Денис Т.> Статус: 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 <Денис Т.> Статус: The Elderman
<"чистая" ссылка>
Warkaround в догонку. 04.10.05 21:20  
Автор: Den <Денис Т.> Статус: 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