มีวิธีใดบ้างในการค้นหาข้อผิดพลาดของหน่วยความจำในขณะที่ทำการคอมไพล์ใน c

สมมติว่าในรหัสของฉันฉันใช้สิ่งนี้

int iLen = 0;
    char *sTmpStr;

strcpy(sTmpStr, "abc");

ตอนนี้ฉันยังไม่ได้จัดสรรที่อยู่ใด ๆ ให้กับตัวชี้ มีตัวเลือกใด ๆ ใน gcc ที่จะแสดงข้อผิดพลาดนี้หรือไม่

ฉันพยายามปรับให้เหมาะสมแล้ว แต่ไม่ได้ทำให้เกิดข้อผิดพลาดนี้

ฉันลอง -fsanitize=address แล้ว แต่เกิดข้อผิดพลาดขณะรันไทม์เช่นนี้

==1982== ข้อผิดพลาด: AddressSanitizer: SEGV บนที่อยู่ที่ไม่รู้จัก 0x000000c38299 (พีซี 0x7f78d7b685b0 sp 0x7ffd8918a0b0 bp 0x7f78d7d7a668 T0)

หรือมีวิธีใดที่ฉันสามารถเขียน o/p นี้ลงในไฟล์ได้


person Grv    schedule 21.08.2015    source แหล่งที่มา
comment
ข้อผิดพลาด: ไม่โดยตรง คำเตือน: ใช่ เปลี่ยนคำเตือนให้เป็นข้อผิดพลาด หวังว่าคงจะเป็นเช่นนั้น   -  person Sourav Ghosh    schedule 21.08.2015
comment
ฉันควรใช้ตัวเลือกใดใน gcc ที่จะแสดงสิ่งนี้เป็นคำเตือน   -  person Grv    schedule 21.08.2015
comment
คุณสามารถใช้ clang กับ --analyze เพื่อรับ Function call argument is an uninitialized value: stackoverflow.com/q/27063678/390913   -  person perreal    schedule 21.08.2015
comment
คอมไพเลอร์ของคุณทั้งหมดที่ทำได้คือออกคำเตือนเนื่องจากคุณใช้ตัวแปรที่ไม่ได้เตรียมใช้งาน sTmpStr คอมไพเลอร์แฟล็ก - วอลล์ควรทำงานได้   -  person Jabberwocky    schedule 21.08.2015
comment
สมมติว่าถ้าฉันเขียนฟรี (sTmpStr); -วอลล์ไม่แสดงสิ่งนี้เป็นการเตือน   -  person Grv    schedule 21.08.2015
comment
คำถามที่เกี่ยวข้อง: stackoverflow.com/ คำถาม/399850/   -  person Klas Lindbäck    schedule 21.08.2015


คำตอบ (2)


การเปิดคำเตือนของคอมไพเลอร์ช่วยได้มาก ระดับการเตือนที่ดี (IMHO) คือ -Wall

ฉันใส่โค้ดตัวอย่างของคุณในโปรแกรม k.c:

#include<stdio.h>
int main()
{
    int iLen = 0;
    char *sTmpStr;

    strcpy(sTmpStr, "abc");
    return 0;
}

การคอมไพล์ให้คำเตือนต่อไปนี้:

$ gcc -Wall k.c -o k
k.c: In function 'main':
k.c:11: warning: unused variable 'iLen'
k.c:14: warning: 'sTmpStr' is used uninitialized in this function
$

คุณสามารถเปลี่ยนคำเตือนเป็นข้อผิดพลาดได้โดยเพิ่มแฟล็ก -Werror

person Klas Lindbäck    schedule 21.08.2015

โดยทั่วไปการใช้คอมไพเลอร์ไม่เพียงพอสำหรับการค้นหาจุดบกพร่องรันไทม์และพฤติกรรมที่ระบุไม่ดี gcc -std=c11 -pedantic-errors -Wall เป็นการเริ่มต้นที่ดี แต่ gcc ยังคงเป็นเพียงคอมไพเลอร์ และวัตถุประสงค์ของคอมไพเลอร์คือการตรวจสอบว่าโค้ดถูกเขียนตามที่มาตรฐานกำหนดหรือไม่ อะไรก็ตามนอกเหนือจากนั้นเป็นเพียงโบนัส

ตัวเลือกระดับมืออาชีพคือการใช้เครื่องมือวิเคราะห์โค้ดแบบคงที่ สิ่งเหล่านี้จะตรวจสอบข้อบกพร่องและปัญหาทั่วไปในโค้ดของคุณ น่าเสียดายที่ไม่มีเครื่องมือดังกล่าวเป็นโอเพ่นซอร์ส เนื่องจากมีราคาค่อนข้างแพง

person Lundin    schedule 21.08.2015
comment
ตัวเลือก -std=c11 ไม่สำคัญในเรื่องนี้และทำให้เข้าใจผิด - person fuz; 25.08.2015
comment
@FUZxxl ไม่ เนื่องจากมีหลายสิ่งที่ระบุพฤติกรรมที่ไม่ดีในมาตรฐาน C ถูกนำมาใช้เป็นส่วนขยายภาษาใน GNU C เว้นแต่ว่าคุณกำลังใช้ส่วนขยาย GNU C ก็ไม่มีเหตุผลที่จะไม่ใช้ -std - person Lundin; 25.08.2015
comment
สิ่งที่ฉันพยายามจะพูดคือคุณไม่จำเป็นต้องระบุ -std=c11 อย่างแท้จริง; หลายโครงการเขียนขึ้นโดยเทียบกับ C89 หรือ C99 เพื่อความเข้ากันได้ และโดยปกติแล้วเป็นความคิดที่ดีที่จะเปลี่ยนการแก้ไขภาษาโดยไม่ประเมินผลที่ตามมา คิดเสมอว่าผู้คนจะคัดลอก (และสั่งสอน) คำตอบของคุณโดยไม่เข้าใจความหมายของแต่ละส่วน - person fuz; 25.08.2015
comment
@FUZxxl ตามนโยบายแท็ก C คำถามทั้งหมดจะถือว่าเกี่ยวกับมาตรฐาน C ปัจจุบัน เว้นแต่จะระบุไว้เป็นอย่างอื่นโดย OP - person Lundin; 25.08.2015
comment
แต่คำตอบของคุณไม่จำเป็นต้องตั้งค่าการแก้ไขมาตรฐานเป็น C11 หากมีคนอ่านคำตอบของคุณและไม่ทราบดีกว่านี้ เขาอาจคิดว่าจำเป็นต้องตั้งค่า -std=c11 เพื่อรับการรายงานข้อผิดพลาดที่เหมาะสม นี่เป็นเท็จอย่างแน่นอน - person fuz; 25.08.2015
comment
สำหรับเครื่องมือวิเคราะห์โค้ดแบบโอเพ่นซอร์ส ให้ดูที่ Frama C - person fuz; 25.08.2015