แฟล็กเพื่อเปิดใช้งานคำเตือน g ++ อย่างละเอียดและละเอียด


122

บ่อยครั้งใน C ภายใต้gccฉันจะเริ่มต้นด้วยชุดคำเตือนต่อไปนี้ (ประกอบอย่างเจ็บปวดจากหลายแหล่ง):

-Wall -Wextra -Wformat-nonliteral -Wcast-align -Wpointer-arith -Wbad-function-cast \
-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Winline -Wundef \
-Wnested-externs -Wcast-qual -Wshadow -Wwrite-strings -Wno-unused-parameter \
-Wfloat-equal -pedantic -ansi

ฉันจะสร้าง (อย่างน้อยเวอร์ชันดีบักของฉัน) ด้วยชุดคำเตือนนี้และแก้ไขทุกสิ่งที่ทำได้ (โดยปกติคือทุกอย่าง) จากนั้นจะลบแฟล็กเฉพาะในกรณีที่ไม่เกี่ยวข้องหรือไม่สามารถแก้ไขได้ (แทบจะไม่เคยเป็นเช่นนั้นเลย) บางครั้งฉันจะเพิ่ม-Werrorด้วยว่าฉันต้องถอยห่างออกไปขณะรวบรวม

ฉันแค่หยิบ C ++ ขึ้นมา (ใช่ฉันล้าหลังกว่า 15 ปี) และฉันต้องการเริ่มต้นอย่างถูกต้อง

คำถามของฉันคือใครมีชุดคำเตือนที่สมบูรณ์ที่คล้ายกันที่คอมไพล์ไว้ล่วงหน้าสำหรับ C ++ ภายใต้g++หรือไม่? (ฉันรู้ว่าพวกเขาหลายคนจะเหมือนกัน)


69
สิ่งที่ต้องการของ GCC (ตั้งแต่มันตัดสินใจที่จะโจ๋งครึ่มโกหกเกี่ยว-Wall) เป็น-Wbloody_everythingธง :-)
paxdiablo

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

4
OP และ @paxdiablo: GCC ได้ปฏิเสธอย่างต่อเนื่องเรียงลำดับของสิ่งนี้ -Weverythingแต่มันมีอยู่ในเสียงดังกราวผ่าน ฉันได้อ่านมาว่าแม้แต่นักพัฒนา Clang ++ ก็กังวลเล็กน้อยเกี่ยวกับผู้ใช้ที่เปิดใช้งาน เห็นได้ชัดว่ามีไว้สำหรับการพัฒนาภายในเท่านั้น อย่างไรก็ตามสิ่งนี้ไม่สมเหตุสมผลเพราะการเปิดเครื่อง-Weverythingอาจเป็นวิธีที่ดีที่สุดในการค้นหาคำเตือนที่อาจเป็นประโยชน์ซึ่งคุณไม่เคยรู้มาก่อน
Kyle Strand

1
OP และ @paxdiablo ตอนนี้มีวิธีในการค้นหารายการคำเตือนทั้งหมดสำหรับเวอร์ชัน GCC ที่กำหนด: github.com/barro/compiler-warnings
Kyle Strand

คำตอบ:


138

ฉันได้ตรวจสอบและพบชุดรวมขั้นต่ำที่ควรได้รับคำเตือนในระดับสูงสุด จากนั้นฉันก็ลบชุดคำเตือนออกจากรายการนั้นซึ่งฉันรู้สึกว่าไม่ได้บ่งชี้ว่ามีสิ่งเลวร้ายเกิดขึ้นจริงหรืออย่างอื่นมีผลบวกเท็จมากเกินไปที่จะใช้ในงานสร้างจริง ฉันแสดงความคิดเห็นว่าเหตุใดแต่ละรายการที่ฉันยกเว้นจึงถูกยกเว้น นี่คือคำเตือนที่แนะนำชุดสุดท้ายของฉัน:

-pedantic -Wall -Wextra -Wcast-align -Wcast-qual -Wctor-dtor-privacy -Wdisabled-optimization -Wformat=2 -Winit-self -Wlogical-op -Wmissing-declarations -Wmissing-include-dirs -Wnoexcept -Wold-style-cast -Woverloaded-virtual -Wredundant-decls -Wshadow -Wsign-conversion -Wsign-promo -Wstrict-null-sentinel -Wstrict-overflow=5 -Wswitch-default -Wundef -Werror -Wno-unused

คำเตือนที่น่าสงสัยที่มีอยู่:

  • ฉันรวมไว้-Wno-unusedเพราะฉันมักจะมีตัวแปรที่ฉันรู้ว่าจะใช้ในภายหลัง แต่ยังไม่มีฟังก์ชันที่เขียนไว้ การลบคำเตือนเกี่ยวกับเรื่องนี้ช่วยให้ฉันสามารถเขียนในรูปแบบที่ฉันต้องการได้ในบางครั้งการเลื่อนการใช้งานสิ่งต่างๆ จะมีประโยชน์ในการปิดทุกครั้งเพื่อให้แน่ใจว่าไม่มีอะไรเล็ดรอดผ่านรอยแตก

  • -Wdisabled-optimizationดูเหมือนว่าเป็นการตั้งค่าความชอบของผู้ใช้ที่แข็งแกร่ง ฉันเพิ่งเพิ่มสิ่งนี้ลงในงานสร้างของฉัน (สำหรับงานสร้างที่ได้รับการปรับให้เหมาะสมด้วยเหตุผลที่ชัดเจนเท่านั้น) และมันไม่ได้เปิดอะไรเลยดูเหมือนจะไม่ใช่คำเตือนโดยเฉพาะอย่างยิ่งสำหรับวิธีที่ฉันเขียนโค้ด ฉันรวมไว้ (แม้ว่ารหัสที่เรียกคำเตือนนี้ไม่จำเป็นต้องผิด) เพราะฉันเชื่อในการทำงานกับเครื่องมือของฉันแทนที่จะต่อต้านพวกเขา หาก gcc บอกฉันว่ามันไม่สามารถปรับแต่งโค้ดให้เหมาะสมกับวิธีที่ฉันเขียนได้ฉันควรดูที่การเขียนใหม่ ฉันสงสัยว่ารหัสที่เรียกคำเตือนนี้อาจได้รับประโยชน์จากการเป็นโมดูลาร์มากขึ้นโดยไม่คำนึงถึงแม้ว่ารหัสจะไม่ผิดในทางเทคนิค (อาจ) ในทางโวหารก็เป็นไปได้

  • -Wfloat-equalเตือนสำหรับการเปรียบเทียบความเท่าเทียมกันอย่างปลอดภัย (โดยเฉพาะอย่างยิ่งการเปรียบเทียบกับค่าที่ไม่ได้คำนวณเป็น -1) ตัวอย่างในโค้ดของฉันที่ฉันใช้นี่คือฉันมีเวกเตอร์ลอย ฉันอ่านเวกเตอร์นี้และมีองค์ประกอบบางอย่างที่ฉันยังประเมินไม่ได้ว่าควรจะเป็นอย่างไรดังนั้นฉันจึงตั้งค่าเป็น -1.0f (เนื่องจากปัญหาของฉันใช้ตัวเลขบวกเท่านั้น -1 จึงอยู่นอกโดเมน) หลังจากนั้นฉันจะผ่านและอัปเดตค่า -1.0f มันไม่ง่ายที่จะยืมตัวเองไปใช้วิธีการทำงานอื่น ๆ ฉันสงสัยว่าคนส่วนใหญ่ไม่มีปัญหานี้และการเปรียบเทียบจำนวนที่แน่นอนในทศนิยมอาจเป็นข้อผิดพลาดดังนั้นฉันจึงรวมไว้ในรายการเริ่มต้น

  • -Wold-style-castมีผลบวกลวงจำนวนมากในรหัสไลบรารีที่ฉันใช้ โดยเฉพาะอย่างยิ่งฟังก์ชั่นตระกูล htonl ที่ใช้ในระบบเครือข่ายรวมถึงการใช้งานการเข้ารหัส Rijndael (AES) ที่ฉันใช้อยู่มีแคสต์แบบเก่าที่เตือนฉันเกี่ยวกับ ฉันตั้งใจจะแทนที่ทั้งสองอย่างนี้ แต่ฉันไม่แน่ใจว่ามีอะไรอีกในรหัสของฉันที่จะบ่น ผู้ใช้ส่วนใหญ่น่าจะเปิดไว้โดยค่าเริ่มต้น

  • -Wsign-conversionเป็นคนที่ยาก (และแทบไม่ได้ทำรายการ) การเปิดใช้งานในรหัสของฉันทำให้เกิดคำเตือนจำนวนมาก (100+) เกือบทั้งหมดเป็นผู้บริสุทธิ์ อย่างไรก็ตามฉันใช้ความระมัดระวังในการใช้จำนวนเต็มที่ลงนามในทุกที่ที่ฉันไม่แน่ใจแม้ว่าสำหรับโดเมนปัญหาเฉพาะของฉันฉันมักจะได้รับประสิทธิภาพเพิ่มขึ้นเล็กน้อยโดยใช้ค่าที่ไม่ได้ลงชื่อเนื่องจากการหารจำนวนเต็มจำนวนมากที่ฉันทำ ฉันเสียสละประสิทธิภาพนี้เพราะฉันกังวลเกี่ยวกับการส่งเสริมจำนวนเต็มที่ลงนามโดยไม่ได้ตั้งใจให้เป็นจำนวนเต็มที่ไม่ได้ลงชื่อแล้วหาร (ซึ่งไม่ปลอดภัยซึ่งแตกต่างจากการบวกการลบและการคูณ) การเปิดคำเตือนนี้ทำให้ฉันสามารถเปลี่ยนตัวแปรส่วนใหญ่เป็นประเภทที่ไม่ได้ลงชื่อได้อย่างปลอดภัยและเพิ่มการร่ายในที่อื่น ๆ ขณะนี้ใช้งานยากเล็กน้อยเนื่องจากคำเตือนไม่ฉลาดเท่าไหร่ ตัวอย่างเช่นถ้าคุณทำunsigned short + (integral constant expression)ผลลัพธ์นั้นได้รับการเลื่อนขั้นเป็น int โดยปริยาย จากนั้นจะเตือนเกี่ยวกับปัญหาสัญญาณที่อาจเกิดขึ้นหากคุณกำหนดค่านั้นให้ unsignedหรือunsigned shortแม้ว่าจะปลอดภัยก็ตาม นี่เป็นคำเตือนที่เป็นทางเลือกมากที่สุดสำหรับผู้ใช้เกือบทั้งหมด

  • -Wsign-promo: ดู-Wsign-conversion.

  • -Wswitch-defaultดูเหมือนไม่มีจุดหมาย (คุณไม่ต้องการกรณีเริ่มต้นเสมอไปหากคุณระบุความเป็นไปได้ทั้งหมดอย่างชัดเจน) อย่างไรก็ตามการเปิดคำเตือนนี้สามารถบังคับใช้บางสิ่งที่น่าจะเป็นความคิดที่ดี สำหรับกรณีที่คุณต้องการละเว้นทุกอย่างอย่างชัดเจนยกเว้นความเป็นไปได้ที่ระบุไว้ (แต่ตัวเลขอื่นเป็นไปได้) ให้ใส่default: break;เพื่อให้ชัดเจน หากคุณระบุความเป็นไปได้ทั้งหมดอย่างชัดเจนการเปิดคำเตือนนี้จะช่วยให้แน่ใจว่าคุณใส่บางอย่างเช่นยืนยัน (เท็จ) เพื่อให้แน่ใจว่าคุณได้ครอบคลุมตัวเลือกที่เป็นไปได้ทั้งหมดแล้ว ช่วยให้คุณเข้าใจได้อย่างชัดเจนว่าโดเมนของปัญหาของคุณคืออะไรและบังคับใช้โดยทางโปรแกรม อย่างไรก็ตามคุณจะต้องระมัดระวังในการยืนยัน (เท็จ) ทุกที่ จะดีกว่าการไม่ทำอะไรเลยกับกรณีเริ่มต้น แต่ตามปกติเมื่อยืนยันแล้วจะใช้ไม่ได้ในรุ่นรุ่น กล่าวอีกนัยหนึ่งคุณไม่สามารถวางใจได้ในการตรวจสอบหมายเลขที่คุณได้รับเช่นการเชื่อมต่อเครือข่ายหรือฐานข้อมูลที่คุณไม่สามารถควบคุมได้ทั้งหมด ข้อยกเว้นหรือการกลับมาก่อนเวลาเป็นวิธีที่ดีที่สุดในการจัดการ (แต่ยังต้องให้คุณมีกรณีเริ่มต้น!)

  • -Werrorเป็นสิ่งที่สำคัญสำหรับฉัน เมื่อรวบรวมโค้ดจำนวนมากในบิวด์แบบมัลติเธรดที่มีหลายเป้าหมายคำเตือนจะหลุดมือได้ง่าย การเปลี่ยนคำเตือนให้เป็นข้อผิดพลาดทำให้ฉันสังเกตเห็นได้

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

คำเตือนที่ไม่มี:

  • -Wabiไม่จำเป็นเพราะฉันไม่ได้รวมไบนารีจากคอมไพเลอร์อื่น ฉันพยายามรวบรวมมันแล้ว แต่มันก็ไม่เกิดขึ้นดังนั้นมันจึงดูเหมือนไม่จำเป็นอย่างยิ่ง

  • -Waggregate-returnไม่ใช่สิ่งที่ฉันถือว่าเป็นข้อผิดพลาด ตัวอย่างเช่นจะทริกเกอร์เมื่อใช้ range-based for loop บนเวกเตอร์ของคลาส การเพิ่มประสิทธิภาพค่าตอบแทนควรดูแลผลกระทบเชิงลบของสิ่งนี้

  • -Wconversionทริกเกอร์รหัสนี้: short n = 0; n += 2;การแปลงโดยนัยเป็น int ทำให้เกิดคำเตือนเมื่อแปลงกลับเป็นประเภทเป้าหมายแล้ว

  • -Weffc++รวมคำเตือนหากสมาชิกข้อมูลทั้งหมดไม่ได้เตรียมใช้งานในรายการตัวเริ่มต้น ฉันตั้งใจที่จะไม่ทำเช่นนี้ในหลาย ๆ กรณีดังนั้นชุดคำเตือนจึงรกเกินกว่าที่จะเป็นประโยชน์ การเปิดใช้งานเป็นระยะ ๆ และสแกนหาคำเตือนอื่น ๆ จะเป็นประโยชน์ (เช่นตัวทำลายที่ไม่ใช่เสมือนของคลาสพื้นฐาน) สิ่งนี้จะมีประโยชน์มากกว่าในการรวบรวมคำเตือน (เช่น-Wall) แทนที่จะเป็นคำเตือนเดียว

  • -Winlineไม่อยู่เนื่องจากฉันไม่ได้ใช้คำหลักแบบอินไลน์เพื่อวัตถุประสงค์ในการเพิ่มประสิทธิภาพเพียงเพื่อกำหนดฟังก์ชันแบบอินไลน์ในส่วนหัว ฉันไม่สนใจว่าเครื่องมือเพิ่มประสิทธิภาพจะแทรกตัวอยู่หรือไม่ คำเตือนนี้ยังบ่นหากไม่สามารถแทรกฟังก์ชันที่ประกาศไว้ในเนื้อหาคลาสได้ (เช่นตัวทำลายเสมือนที่ว่างเปล่า)

  • -Winvalid-pch หายไปเพราะฉันไม่ได้ใช้ส่วนหัวที่คอมไพล์ไว้ล่วงหน้า

  • -Wmissing-format-attributeไม่ได้ใช้เพราะฉันไม่ได้ใช้ส่วนขยาย gnu เหมือนกัน-Wsuggest-attributeและอื่น ๆ อีกมากมาย

  • อาจเป็นที่น่าสังเกตสำหรับการไม่มีอยู่-Wno-long-longซึ่งฉันไม่จำเป็นต้องมี ฉันรวบรวมด้วย-std=c++0x( -std=c++11ใน GCC 4.7) ซึ่งรวมถึงlong longประเภทจำนวนเต็ม ผู้ที่ติดอยู่ใน C ++ 98 / C ++ 03 อาจพิจารณาเพิ่มการยกเว้นนั้นจากรายการคำเตือน

  • -Wnormalized=nfc เป็นตัวเลือกเริ่มต้นอยู่แล้วและดูเหมือนจะดีที่สุด

  • -Wpaddedจะเปิดเป็นครั้งคราวเพื่อปรับเลย์เอาต์ของชั้นเรียนให้เหมาะสมที่สุด แต่ก็ไม่ได้เปิดไว้เนื่องจากบางชั้นเรียนมีองค์ประกอบไม่เพียงพอที่จะลบช่องว่างในตอนท้าย ตามทฤษฎีแล้วฉันจะได้รับตัวแปรพิเศษบางตัวสำหรับ 'ฟรี' แต่ก็ไม่คุ้มค่ากับความพยายามเพิ่มเติมในการดูแลรักษา (หากขนาดชั้นเรียนของฉันเปลี่ยนไปการลบตัวแปรฟรีก่อนหน้านี้นั้นไม่ใช่เรื่องง่าย)

  • -Wstack-protector ไม่ได้ใช้เพราะฉันไม่ได้ใช้ -fstack-protector

  • -Wstrict-aliasing=3เปิดอยู่-Wallและแม่นยำที่สุด แต่ดูเหมือนว่าระดับ 1 และ 2 จะให้คำเตือนมากกว่า ตามทฤษฎีแล้วระดับที่ต่ำกว่าคือคำเตือนที่ 'แรงกว่า' แต่ก็มีค่าใช้จ่ายของผลบวกที่ผิดพลาดมากกว่า รหัสทดสอบของฉันเองรวบรวมอย่างหมดจดภายใต้ทั้ง 3 ระดับ

  • -Wswitch-enumไม่ใช่พฤติกรรมที่ฉันต้องการ ฉันไม่ต้องการจัดการทุกคำสั่งสวิตช์อย่างชัดเจน มันจะมีประโยชน์ถ้าภาษามีกลไกบางอย่างในการเปิดใช้งานสิ่งนี้ในคำสั่ง switch ที่ระบุ (เพื่อให้แน่ใจว่าการเปลี่ยนแปลงในอนาคตของ enum จะได้รับการจัดการทุกที่ที่จำเป็นต้องเป็น) แต่มันเกินความจำเป็นสำหรับการตั้งค่า "ทั้งหมดหรือไม่มีเลย"

  • -Wunsafe-loop-optimizationsทำให้เกิดคำเตือนที่หลอกลวงมากเกินไป อาจเป็นประโยชน์ในการใช้สิ่งนี้เป็นระยะและตรวจสอบผลลัพธ์ด้วยตนเอง ตัวอย่างเช่นมันสร้างคำเตือนนี้ในโค้ดของฉันเมื่อฉันวนซ้ำองค์ประกอบทั้งหมดในเวกเตอร์เพื่อใช้ชุดของฟังก์ชันกับพวกเขา (โดยใช้ range-based สำหรับการวนซ้ำ) นอกจากนี้ยังเป็นการเตือนสำหรับตัวสร้างของอาร์เรย์ const ของ const std :: string (โดยที่นี่ไม่ใช่การวนซ้ำในรหัสผู้ใช้)

  • -Wzero-as-null-pointer-constantและ-Wuseless-castเป็นคำเตือนเฉพาะ GCC-4.7 ซึ่งฉันจะเพิ่มเมื่อเปลี่ยนเป็น GCC 4.7

ฉันได้ยื่นรายงานข้อบกพร่อง / คำขอการปรับปรุงบางส่วนที่ gcc อันเป็นผลมาจากการวิจัยบางส่วนดังนั้นหวังว่าในที่สุดฉันจะสามารถเพิ่มคำเตือนจากรายการ "ไม่รวม" ไปยังรายการ "รวม" ได้ . รายการนี้มีคำเตือนทั้งหมดที่กล่าวถึงในชุดข้อความนี้ (และฉันคิดว่ามีอะไรเพิ่มเติมอีกเล็กน้อย) คำเตือนหลายคำที่ไม่ได้กล่าวถึงอย่างชัดเจนในโพสต์นี้รวมอยู่ในคำเตือนอื่นที่ฉันพูดถึง หากใครสังเกตเห็นคำเตือนใด ๆ ที่ไม่รวมอยู่ในโพสต์นี้โปรดแจ้งให้เราทราบ

แก้ไข:ดูเหมือนว่าฉันพลาดหลายอย่าง (ซึ่งตอนนี้ฉันได้เพิ่มเข้าไปแล้ว) มีหน้าที่สองที่http://gcc.gnu.orgซึ่งซ่อนไว้ค่อนข้างดี ตัวเลือกคำเตือนทั่วไปและตัวเลือกC ++ (เลื่อนลงไปด้านล่างเพื่อดูคำเตือน)


ฉันเพิ่งส่งคำขอเพิ่มประสิทธิภาพจากการวิจัยของฉันสำหรับคำตอบนี้: gcc.gnu.org/bugzilla/show_bug.cgi?id=53313 มันจะทำให้สถานการณ์การเตือนง่ายขึ้นอย่างมากโดยการสร้างระดับการเตือน ในข้อเสนอของฉันชุดคำเตือนที่แนะนำคือประมาณ -W4 โดยมีข้อเสนอเพิ่มเติมในการสร้าง -Winf ซึ่งจะหมายถึง -Weverything-and-I-mean-it-this-time
David Stone

คำขอเพิ่มประสิทธิภาพที่จะทำให้ส่วนของ -Wpadded ถูกเพิ่มในรายการแนะนำ: gcc.gnu.org/bugzilla/show_bug.cgi?id=53514
David Stone

คำขอเพิ่มประสิทธิภาพที่จะทำให้บางส่วนของ -Weffc ++ ถูกเพิ่มในรายการแนะนำ: gcc.gnu.org/bugzilla/show_bug.cgi?id=16166
David Stone

1
@Predelnik: มันยากกว่านั้น -Wswitch-enumเตือนหากคุณไม่จัดการกับค่าการแจงนับทุกค่าในสวิตช์defaultอย่างชัดเจนและไม่นับว่าชัดเจน ในทางกลับกัน-Wswitch-defaultเตือนคุณหากสวิตช์ของคุณไม่มีdefaultเคสแม้ว่าคุณจะครอบคลุมค่าที่เป็นไปได้ทั้งหมดอย่างชัดเจนแล้วก็ตาม
David Stone

2
BTW - ใช้-isystemแทน-I"รหัสห้องสมุดเก่า" ของคุณเพื่อป้องกันผลบวกที่ผิดพลาดทั้งหมด
galois

39

การค้นหาเดิมทั้งหมดของฉันพบว่า 99% ของโพสต์เกี่ยวกับวิธีระงับคำเตือน (น่ากลัวพอสมควร) แต่ฉันเพิ่งพบกับความคิดเห็นนี้ซึ่งมีชุดค่าสถานะที่น่ารักนี้ (บางส่วนมีความเกี่ยวข้องน้อยกว่า):

ขีดฆ่าด้วย:

http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html

-g -O -Wall -Weffc++ -pedantic  \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security  \
-Wformat-y2k \
-Wimplicit  -Wimport  -Winit-self  -Winline \
-Winvalid-pch   \
-Wlong-long \
-Wmissing-field-initializers -Wmissing-format-attribute   \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked  -Wpadded -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings

ดังนั้นฉันคิดว่านั่นเป็นจุดเริ่มต้นที่ดี ไม่ได้ตระหนักว่านี่เป็นการหลอกลวง แต่อย่างน้อยมันก็ฝังลึก :-)


1
บางที แต่ดูเหมือนว่าจะเปลี่ยนไประหว่างเวอร์ชันและน่าจะเป็นไปตามความต้องการของดวงอาทิตย์และ RMS ดังนั้นการเปิดเผยมากเกินไปอาจไม่เจ็บ มันเป็นจุดเริ่มต้นที่ดีอยู่แล้ว
Sdaz MacSkibbons

3
จาก grep อย่างรวดเร็วของ c-opts.c / opts.c ของ 4.5.2 สำหรับ 'case OPT_W' คุณจะขาดหายไป: การล้นที่เข้มงวด, undef, ผู้เฝ้ายาม nul ที่เข้มงวด, การทำให้เป็นมาตรฐาน, หลายคำ, การประกาศฟังก์ชันโดยนัย, เลิกใช้แล้ว, ป้ายกำกับ endif, ความคิดเห็นs , แมโครในตัวนิยามใหม่, ใหญ่กว่า, ใหญ่กว่า eq, abi มันบ้ามากที่ไม่มีตัวเลือกบรรทัดคำสั่งให้แสดงรายการ
Tony Delroy

3
ฉันคิดว่ามันบ้ากว่าที่-Wallไม่ได้ทำตามที่ใคร ๆ คาดหวัง แต่ขอบคุณบางส่วนดูมีประโยชน์มาก!
Sdaz MacSkibbons

1
การปิดใช้งานคำเตือนมีที่มาที่ไป ท้ายที่สุดพวกเขาคือ "คำเตือน" อีกสถานการณ์หนึ่งคือเมื่อคุณเปิดใช้งานแฟล็กที่เปิดใช้งานคำเตือนหลายรายการ แต่คุณต้องการเลือกใช้
Tamás Szelei

1
คุณสามารถใช้งานได้-Waggregate-returnอย่างไร? สิ่งนี้ช่วยเตือนฉันสำหรับการใช้งานทุกครั้งbegin/end()
Flamefire

13

บางส่วนของเหล่านี้จะรวมอยู่ในหรือ-Wall-Wextra

การตั้งค่าพื้นฐานที่ดีสำหรับ C คือ:

-std=c99 -pedantic -Wall -Wextra -Wwrite-strings -Werror

และสำหรับ C ++

-ansi -pedantic -Wall -Wextra -Weffc++

(การข้าม-WerrorC ++ เนื่องจาก-Weffc++มีความรำคาญ)


10
- สามารถปิดใช้งานข้อผิดพลาดสำหรับคำเตือนบางประเภทได้เช่น -Werror -Weffc ++ -Wno-error = effc ++
Robert Hensing

2
ansi : ในโหมด C จะเทียบเท่ากับ-std=c89. ในโหมด C ++ จะเทียบเท่ากับ-std=c++98. เช่นถ้าคุณกำลังระบุบางอย่างstdอย่าใช้ansi
Sean Breckenridge

2

ลอง

export CFLAGS="`gcc --help=warnings | grep '\-W' | awk '{print $1 \" \"}' |
sort | uniq` -pedantic -fdiagnostics-show-option -Werror"

นั่นเป็นการเริ่มต้นที่รวดเร็วและสกปรกซึ่งแน่นอนว่าจะต้องมีการปรับจูน สำหรับสิ่งหนึ่งแม้ว่าคุณจะเรียกคอมไพเลอร์ด้วยชื่อที่เหมาะสมสำหรับภาษาของคุณ (เช่นg++ C ++) คุณจะได้รับคำเตือนที่ใช้ไม่ได้กับภาษานั้น (และคอมไพเลอร์จะยกมือขึ้นและปฏิเสธที่จะดำเนินการต่อจนกว่าคุณจะ ลบคำเตือน)

อีกอย่างคือฉันเพิ่มเข้ามา-Werrorเพราะถ้าคุณไม่แก้ไขคำเตือนทำไมคุณถึงสนใจที่จะเปิดใช้ คุณยังสามารถนำคำเตือนออกจากรายการได้ (ตัวอย่างเช่นฉันแทบไม่เคยใช้-Waggregate-returnกับ C ++ เลย)

คำเตือนบางอย่างจะไม่ทำอะไรเลยหากไม่มีตัวเลือกอื่น ๆ ที่เกี่ยวข้องกับประสิทธิภาพ ( -Wstack-protector)-fdiagnostics-show-optionและคู่มือ GCC คือเพื่อนของคุณ

อย่างไรก็ตามคำเตือนบางอย่างไม่สามารถใช้ร่วมกันได้ โดยเฉพาะอย่างยิ่งการใช้-Wtraditionalและ-Wold-style-definitionควบคู่ไปด้วย-Werrorจะไม่รวบรวม


0

ใน CmakeLists.txt ของ Clion ของฉัน

cmake_minimum_required(VERSION 3.13)
project(cpp17)

set(CMAKE_CXX_STANDARD 17)

set(GCC_COVERAGE_COMPILE_FLAGS "-std=c++17 -Wall -Weffc++ -Wno-error=effc++ -pedantic \
 -Weverything -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-newline-eof  \
-pedantic-errors -Wextra -Waggregate-return -Wcast-align \
-Wcast-qual -Wconversion \
-Wdisabled-optimization \
-Werror -Wfloat-equal -Wformat=2 \
-Wformat-nonliteral -Wformat-security  \
-Wformat-y2k \
-Wimplicit  -Wimport  -Winit-self  -Winline -Winvalid-pch   \
-Wlong-long \
-Wmissing-field-initializers -Wmissing-format-attribute   \
-Wmissing-include-dirs -Wmissing-noreturn \
-Wpacked  -Wpadded -Wpointer-arith \
-Wredundant-decls \
-Wshadow -Wstack-protector \
-Wstrict-aliasing=2 -Wswitch-default \
-Wswitch-enum \
-Wunreachable-code -Wunused \
-Wunused-parameter \
-Wvariadic-macros \
-Wwrite-strings")


set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS}" )

add_executable(cpp17 main.cpp)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.