Неинициализированные участники структуры всегда обнуляются?

Команда оболочки type обнаружит встроенные команды, псевдонимы, функции, внешние команды и т. Д.

child_process = require('child_process')

['lua','foobar'].forEach((cmd) => {
  result = child_process.spawnSync('sh', ['-c', `type ${cmd}`])
  console.log(result.status + '\t' + result.stdout.toString())
})
0       lua is /usr/local/bin/lua

127     foobar: not found

Действительно, злонамеренный ввод все еще злонамеренный.

Вот один из обходных путей: заключите команду в строку type cmd, но вам придется обрабатывать любые кавычки в самой команде

// 1. shell-quote any single quotes in the cmd
cmd = "da$(echo 'hello world')te";      // 'da$(echo \'hello world\')te'
escaped = cmd.replace(/'/g, `'"'"'`);   // 'da$(echo \'"\'"\'hello world\'"\'"\')te'
// 2. in the command string, quote the escaped cmd argument
result = child_process.spawnSync('sh', ['-c', `type '${escaped}'`]);
// .................................................^..........^
console.log(result.status, result.stdout.toString());
127 'da$(echo \'hello world\')te: not found\n'

И включить @ Чтобы найти слово команды , сначала нужно проанализировать любые лидирующие назначения и / или перенаправления переменных ( https://www.gnu.org/software/bash/manual). /bashref.html#Simple-Command-Expansion) и / или ведущие открытые скобки или фигурные скобки и / или ... в основном реализуют синтаксический анализатор sh.

20
задан bk1e 3 April 2009 в 04:14
поделиться

3 ответа

объект 8.5.1.7 из стандартного проекта:

- 7-, Если в агрегате существует меньше инициализаторов в списке, чем, существуют участники, то каждый участник, не явно инициализированный, должен быть инициализирован значением по умолчанию (dcl.init). [Пример:

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };

инициализирует ss.a с 1, ss.b с "asdf" и ss.c со значением выражения интервала формы (), то есть, 0.]

27
ответ дан 29 November 2019 в 22:58
поделиться

Это, как гарантируют, будет 0, если это будет частично инициализировано, точно так же, как инициализаторы массива. Если это будет неинициализированным, то это будет неизвестно.

struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to)

struct T t = {42}; // t.y will be initialized to 0.

Так же:

int x[10]; // Won't be initialized.

int x[10] = {1}; // initialized to {1,0,0,...}

Образец:

// a.c
struct T { int x, y };
extern void f(void*);
void partialInitialization() {
  struct T t = {42};
  f(&t);
}
void noInitialization() {
  struct T t;
  f(&t);
}

// Compile with: gcc -O2 -S a.c

// a.s:

; ...
partialInitialzation:
; ...
; movl $0, -4(%ebp)     ;;;; initializes t.y to 0.
; movl $42, -8(%ebp)
; ...
noInitialization:
; ... ; Nothing related to initialization. It just allocates memory on stack.
28
ответ дан 29 November 2019 в 22:58
поделиться

Нет. это, как гарантируют, будет 0.

3
ответ дан 29 November 2019 в 22:58
поделиться