[英]Why is printf() printing out in this code?
這個簡單的代碼使我感到困惑-我故意打印出比傳遞給printf的整數更多的整數。 我預期會發生錯誤。 我有奇怪的數字-它們來自哪里?
#include <stdio.h>
/* learn arrays */
void main(){
int pout;
pout = 6;
printf("%i %i %i\n%i %i %i\n%i %i %i\n", pout);
}
輸出的一個示例:
6 608728840 0
-885621664 -885543392 608728816
0 0 -889304251
單個數字不會隨着重復運行而改變,但是大整數會改變。
這是printf字符串格式漏洞之一。 您正在嘗試調用比實際更多的參數,因此printf會盡其所能。
它曾經(現在仍然)非常常用於開發程序,以探索堆棧以訪問隱藏信息或例如繞過身份驗證。
查看堆棧
printf ("%08x %08x %08x %08x %08x\\n");
這指示printf函數從堆棧中檢索五個參數,並將它們顯示為8位填充的十六進制數字。 因此,可能的輸出如下所示:
40012980 080628c4 bffff7a4 00000005 08059c04
請參閱此內容以獲得更完整的說明。
因為它是未定義的行為。 如果說明符的數量大於匹配參數的數量,或者它們的類型不兼容,則行為不確定。
此qoute來自c11標准草案
7.21.6.1
fprintf
函數
fprintf
函數在格式所指向的字符串的控制下,將輸出寫入流所指向的流,該字符串指定了如何轉換后續參數以進行輸出。 如果格式的參數不足,則行為未定義 。 如果在保留參數的同時用盡了格式,則會對多余的參數進行評估(一如既往),否則將被忽略。 當遇到格式字符串的結尾時,fprintf函數將返回。
- 如果轉換規范無效,則行為未定義。 282) 如果任何參數都不是對應轉換規范的正確類型,則該行為是undefined 。
我強調了相關部分,使它們大膽。
int保留了一些RAM,但是您沒有寫任何東西,因此它向您顯示RAM中某處隨機的數字
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.