簡體   English   中英

為什么在此代碼中打印出printf()?

[英]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函數

  1. fprintf函數在格式所指向的字符串的控制下,將輸出寫入流所指向的流,該字符串指定了如何轉換后續參數以進行輸出。 如果格式的參數不足,則行為未定義 如果在保留參數的同時用盡了格式,則會對多余的參數進行評估(一如既往),否則將被忽略。 當遇到格式字符串的結尾時,fprintf函數將返回。

  1. 如果轉換規范無效,則行為未定義。 282) 如果任何參數都不是對應轉換規范的正確類型,則該行為是undefined

我強調了相關部分,使它們大膽。

int保留了一些RAM,但是您沒有寫任何東西,因此它向您顯示RAM中某處隨機的數字

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM