Проблемы TCL с восьмеричными числами после переноса с EDK 1.05 на EDK2

У меня есть инструмент EFI Shell, который использует источники EDK 1.05 и TCL 8.3. Этот инструмент принимает пользовательские команды для отображения информации об адаптере PCI-E и обновления прошивки на нем. Я недавно портировал его на UDK2017. Я использую инструментальную цепочку VS2012x86 для создания инструмента.

Когда я запускаю двоичный файл из EFI Shell, TCL сообщает об ошибках, подобных этим.

can't use invalid octal number as operand of "||"
syntax error in expression "(1<<0)"
syntax error in expression "(0x1<<0)"

Я читал о TCL и восьмеричных числах, так как эта проблема не встречается с кодом EDK 1.05 с тем же Версия TCL, мне интересно, есть ли какой-нибудь флаг, который я упускаю. Я надеюсь, что есть простое решение, чтобы обойти эту ошибку, поскольку в версии TCL не было изменений.


person user10319118    schedule 05.09.2018    source источник
comment
Ничего себе… 8.3 довольно долго без поддержки (более десяти лет!). Его преемник 8.4 также не поддерживается, а 8.5 в настоящее время находится только на долгосрочной поддержке. Не твоя вина, конечно, но есть определенный предел ...   -  person Donal Fellows    schedule 05.09.2018


Ответы (1)


Восьмеричный выпуск

Трудно быть уверенным, но я подозреваю, что из-за проблемы с восьмеричным числом у вас есть код, который анализирует что-то вроде 080808 как число, которое интерпретируется как восьмеричное из-за ведущего 0 (точно так же, как константа в C или C ++), и поэтому не может содержать 8 (или 9). Чтобы точно разобрать число как десятичное, используется команда scan:

set val 080808
scan $val "%d" parsedVal
# Properly, should check that [scan] has a result of 1, but I probably wouldn't bother
puts "$val -> $parsedVal"

Ошибка синтаксиса нечетного выражения

Остальные syntax error in expression "(1<<0)" ошибки выглядят более странно, так как это определенно правильный синтаксис. У меня на этой машине есть только версии до 8.4, но…

$ tclsh8.4
% expr (1<<0)
1

Единственное, что может быть недопустимым выражением, - это если оно написано либо на каком-то настраиваемом языке выражений (который будет зависеть от приложения; вам нужно будет прочитать документацию, чтобы понять это), либо если вы используете строку выражения как числовое значение:

% set val (1<<0)
(1<<0)
% expr {$val + 1}
can't use non-numeric string as operand of "+"

но это не приведет к той ошибке, которую вы видите. Действительно, очень загадочно!

Использовать трассировки стека

Есть кое-что, что может помочь вам понять, что происходит. После ошибки глобальная переменная errorInfo генерирует трассировку стека. Например, после вышеуказанного сообщения об ошибке expr он имеет следующее:

% puts $errorInfo
can't use non-numeric string as operand of "+"
    while executing
"expr {$val + 1}"

Хорошо то, что это говорит вам, какая именно команда и где вызвали ошибку; это может иметь огромное значение в вашей детективной работе по поиску ваших проблем.

person Donal Fellows    schedule 05.09.2018
comment
Спасибо, Донал! У меня много мест, где видна синтаксическая ошибка. Так что использовать сканирование немного сложно. Трассировка стека определенно полезна. - person user10319118; 07.09.2018