Проблемы TCL с восьмеричными числами, замеченными после портирования от EDK 1.05 до EDK2 - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть инструмент 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 не было никаких изменений.

1 Ответ

0 голосов
/ 05 сентября 2018

Восьмой выпуск

Трудно быть уверенным, но я подозреваю, что с проблемой восьмеричного числа у вас есть код, который разбирает что-то вроде 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}"

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

...