Во время обучения C я допустил некоторые ошибки и напечатанные элементы массива символов, которые были неинициализированы.
Если я увеличиваю размер массива достаточно большим, скажем, 1 миллион элементов в размере, а затем распечатать содержимое, то, что выходит, не всегда не читается пользователем, но, похоже, содержит некоторую информацию о времени выполнения.
Рассмотрим следующий код:
#include <stdio.h>
main() {
char s[1000000];
int c, i;
printf("Enter input string:\n");
for (i = 0; ( c = getchar()) != '\n'; i++) {
s[i] = c;
}
printf("Contents of input string:\n");
for (i = 0; i < 999999; i++) {
putchar(s[i]);
}
printf("\n");
return 0;
}
Просто прокручивая вывод, я нахожу такие вещи, как:
??? л???????? _ dyldVersionNumber_dyldVersionString_dyld_all_image_infos_dyld_fatal_error_dyld_shared_cache_ranges_error_string__mh_dylinker_header_stub_binding_helper_dyld_func_lookup_offset_to_dyld_all_image_infos__dyld_start__ZN13dyldbootstrapL30randomizeExecutableLoadAddressEPK12macho_headerPPKcPm__ZN13dyldbootstrap5startEPK12macho_headeriPPKcl__ZN4dyldL17setNewProgramVarsERK11ProgramVars__ZN4dyld17getExecutablePathEv__ZN4dyld22mainExecutablePreboundEv__ZN4dyld14mainExecutableEv__ZN4dyld21findImageByMachHeaderEPK11mach_header__ZN4dyld26findImageContainingAddressEPKv
а также
Apple Inc.1 & 0 $U? 0? *? H?? ot CA0? "0учетный центр сертификации10U? 䑩?? GP?? ^ y? -? 6? WLU???? Kl??" 0? > ? P? A????? f? $KУ???? z ? G? [? 73?? М? Я?? г?] _??? d5 # К.Ю.????? Р?? XPG?? ˬ, (& alpha;) & le; & lambda;?? Т.Б.
?!. Т < & Alpha; 3 & bull; 0 & times; 2 & bull; h & le; g & le; & le; v & le; 3 & alpha; w & le; - & le; z0 & le; v0U & le; 0U & le; 0 & le;. @?? GM ^ 0U # 0? +? IG? V?? k?. @?? GM ^ 0? U 0? 0?? H?? cd0?? 0+ https://www.apple.com/appleca/0?+0????Reliance on этот сертификат любой стороной предполагает принятие тогда применимые стандартные условия использования, сертификат poli?\6? Lx? 팛? w? v? w0O???? = G7? @?, Ա? ؾ? s? d? yO4 آ > ? x? k??} 9? S? 8i?? вывода 01 Н?? [d c3w:??!?????, V?? ں Так?? 6 U7?? 2B??? д ~ R?? B $*?? М ^ С К Р???????? 7? уу! 0? 0?? 0
Я считаю, что однажды моя переменная среды $PATH
была даже распечатана.
Может ли содержимое неинициализированной переменной представлять угрозу безопасности?
Обновление 1
Обновление 2
Таким образом, из ответов видно, что это действительно угроза безопасности. Это меня удивляет.
Нет ли способа, чтобы программа объявляла свой контент памяти защищенным, чтобы позволить ОС ограничивать любой доступ к ней, кроме программы, которая инициализировала эту память?