Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Чем плох %n в printf?

#cpp #c #безопасность #инспекция_кода #language_lawyer


http://ideone.com/ffjDAv

#include 

char *names = "Windows\0System\0Config\0";

int main() {
  int l, r;

  for (char *name=names; *name; name+=r-l+1)
    if (printf("Folder: %n%s%n\n", &l, name, &(r=0)), !r)
      break; // Произошла ошибка, вероятно, стоит что-то сделать

  return 0;
}


Понятно, что при скармливании printfу пользовательских строк в качестве формата,
%n может сделать что-то нехорошее. Но есть ли от него вред в подобном коде по сравнению
с вариантом, в котором он не используется?

http://ideone.com/xd5SYu

#include 
#include 

char *names = "Windows\0System\0Config\0";

int main() {
  for (char *name=names; *name; name+=strlen(name)+1)
    printf("Folder: %s\n", name);

  return 0;
}


PS: На основе обсуждения в другом ответе.
    


Ответы

Ответ 1



Если потом вместо printf кто-нибудь напишет wprintf - то первый код сломается для строк, содержащих национальные символы.

Комментариев нет:

Отправить комментарий