在学习 C 时,我犯了一些错误并打印了未初始化的字符数组的元素。
如果我将数组的大小扩大到相当大,比如 100 万个元素,然后打印内容,结果并不总是用户不可读,但似乎包含一些运行时信息。
考虑以下代码:
#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;
}
只需滚动浏览输出,我就会发现以下内容:
?? ?l?? ?????? _ 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?"0ple Certification Authority10U ?䑩 ??GP??^y?-?6?WLU??Kl??"0?>?P ? A?????f?$kУ????z ?G?[?73??M?i??r?]?_???d5#KY?????P??XPg? ?ˬ, op??0??C??=?+I(??ε??^??=?:??? ?b??q?GSU?/A????p??LE~ LkP?A??tb
?!.t?< ?A?3???0X?Z2?h???es?g^e?I?v?3e?w??-??z0?v0U?0U ?0?0U+?iG?v ??k?.@??GM^0U#0?+?iG?v ??k?.@??GM^0?U 0?0 ??H??cd0? ?0+ https: //www.apple.com/appleca/0?+0????任何一方对本证书的依赖假定接受当时适用的标准使用条款和条件,证书 poli?\6?Lx ?팛??w??v?w0O????=G7?@?,Ա?ؾ?s???d?yO4آ>?x?k??}9??S ?8ı??O 01 ? H??[d?c3w?:,V??!�sO??6?U٧??2B???q?~?R??B$*??M?^c?K?P???? ????7?uu!0?0??0
我相信有一次我的$PATH
环境变量甚至被打印出来了。
未初始化变量的内容会带来安全风险吗?
更新 1
更新 2
因此,从答案中可以清楚地看出这确实存在安全风险。这让我很惊讶。
程序是否无法声明其内存内容受保护以允许操作系统限制对它的任何访问,而不是初始化该内存的程序?