มีตัวเลือก GCC เพื่อเตือนเกี่ยวกับการเขียน `ฟิลด์นี้ 'แทน' this-> field` หรือไม่?

Caduchon 09/20/2017. 4 answers, 4.968 views
c++ gcc gcc-warning

โค้ดต่อไปนี้ (ที่มีข้อบกพร่องร้ายแรง) รวบรวมโดย GCC โดยไม่มีคำเตือนใด ๆ แต่แน่นอนมันไม่ได้ทำงานตามที่คาดไว้โดยนักพัฒนา (ฉัน)

#include struct A
{
    bool b;
    void set(bool b_) { this->b = b_; }
    bool get() const { return this-b; } // The bug is here: '-' instead of '->'
};

int main()
{
    A a;
    a.set(true);
    std::cout << a.get() << std::endl; // Print 1
    a.set(false);
    std::cout << a.get() << std::endl; // Print 1 too...
    return 0;
} 

ฉันสามารถเพิ่มคำเตือนสำหรับคอมไพเลอร์ (GCC 4.8) เพื่อหลีกเลี่ยงข้อผิดพลาดประเภทนี้ได้อย่างไร?

คำถามที่ถูกเชื่อมโยง: มีตัวเลือกใดในการบังคับ (หรือเตือน) การเข้าถึงตัวแปร / ฟังก์ชันของสมาชิกด้วย - this-> หรือไม่?

5 Comments
4 Ari0nhh 09/20/2017
นี่คือประโยค C ++ ที่ถูกต้องดังนั้นคอมไพเลอร์จะไม่สามารถสร้างคำเตือนได้ คุณควรใช้เครื่องมือวิเคราะห์โค้ดแบบคงที่แทน
18 user2079303 09/20/2017
@ Ari0nhh คอมไพเลอร์ส่วนใหญ่ผลิตคำเตือนสำหรับ "ถูกต้อง" C + + ประโยค อย่างน้อยที่สุดเมื่อใช้ตัวเลือกเตือนอย่างชัดเจน
6 UKMonkey 09/20/2017
ฉันคิดว่านี่แสดงให้เห็นอย่างสมบูรณ์ว่าทำไมการทดสอบหน่วยมีค่า
42 Lưu Vĩnh Phúc 09/20/2017
อย่าใช้สิ่งนี้ - this-> ที่จะหลีกเลี่ยงปัญหาได้อย่างสมบูรณ์
16 Sean Burton 09/20/2017
คอมไพเลอร์ส่วนใหญ่ผลิตคำเตือนสำหรับ "ถูกต้อง" C + + ประโยค ": ฉันไปถึงบอกว่าคำเตือน all มาจาก" ถูกต้อง "C + + ประโยค หากไม่ใช่รหัสที่ถูกต้องคุณจะได้รับข้อผิดพลาดแทน

4 Answers


Arne Vogel 09/20/2017.

ปัญหานี้ได้รับการตรวจสอบโดย cppcheck :

  $ cppcheck --enable = ทั้งหมดนี้ - ลบ - bool.cxx   กำลังตรวจสอบ - ลบ -bool.cxx ...  [ลบ -bool.cxx: 7]: (คำเตือน) ลบตัวชี้ที่น่าสงสัย  คุณตั้งใจจะเขียน '->' หรือไม่?  (ข้อมูล) Cppcheck ไม่สามารถหาไฟล์ทั้งหมดรวม (ใช้ - เช็ค - config สำหรับรายละเอียด) 

นี่เป็นเส้นทางที่ไม่รวม ถ้าฉันเพิ่ม -I /usr/include/c++/4.8/ ปัญหายังคงถูกตรวจพบ:

  กำลังตรวจสอบ - ลบ -bool.cxx ...  [this-minus-bool.cxx]: (ข้อมูล) #ifdef configurations มากเกินไป - cppcheck ตรวจสอบเฉพาะ 12 จาก 45 รูปแบบ  ใช้ - บังคับให้ตรวจสอบการกำหนดค่าทั้งหมด  [ลบ -bool.cxx: 7]: (คำเตือน) ลบตัวชี้ที่น่าสงสัย  คุณตั้งใจจะเขียน '->' หรือไม่?  [/usr/include/c++/4.8/bits/ostream.tcc:335]: (style) Struct '__ptr_guard' มีนวกรรมิกที่มีอาร์กิวเมนต์ 1 ข้อที่ไม่ชัดเจน  [/usr/include/c++/4.8/bits/locale_classes.tcc:248]: (ข้อผิดพลาด) เลิกใช้ตัวชี้ที่ถูกยกเลิก: __c 

จากนั้น cppcheck จะทำงานผ่านการกำหนดค่า #ifdef กล่าวมา

(เป็นข้อสังเกตด้านข้อผิดพลาดใน local_classes.tcc เป็นข้อมูลเชิงบวกที่เป็นเท็จ แต่นี่เป็นเรื่องยากมากที่จะบอกเกี่ยวกับเครื่องมืออัตโนมัติเนื่องจากจะต้องทราบว่าไม่ควรป้อนบล็อคการ catch ที่ไซต์นี้เมื่อมาโคร __EXCEPTIONS ไม่มีการตั้งค่า)

คำเตือน: ฉันไม่มีประสบการณ์อื่นกับ cppcheck

5 comments
10 Caduchon 09/20/2017
ฉันชอบบวกเท็จมากกว่าข้อบกพร่องร้ายกาจ :-)
Arne Vogel 09/20/2017
แน่นอนว่า ... เครื่องมือนี้ดูเหมือนจะไม่ก่อให้เกิดประโยชน์มากนักในกรณีใด ๆ และยังช่วยให้คุณสามารถเขียนการกดราคา (ยังไม่ได้พยายามทำเช่นนี้)
9 JPhi1618 09/20/2017
@Caduchon นั่นเป็นความจริงจนถึงจุดที่คุณได้รับผลบวกปลอมจำนวนมากที่คุณไม่สามารถมองเห็นคำเตือนที่สำคัญได้อีกต่อไป
2 Caduchon 09/20/2017
@ JPhi1618: ที่จริงเช่นกัน ฉันมีปัญหากับคอมไพเลอร์ของ Intel ฉันไม่สามารถปิดการแจ้งเตือนเมื่อเพิ่ม ฉันได้รับคำเตือนมากกว่า 100.000 คำในการเพิ่มไลบรารี เป็นไปไม่ได้ที่จะเห็นฉัน
3 Daniel Marjamäki 09/22/2017
ฉันเป็นนักพัฒนา Cppcheck ฉันต้องการจริงๆว่ามันจะเป็นเครื่องมือ defacto ใช้โดยนักพัฒนา C / C + +. แล้วคำตอบนี้จะดีพอสำหรับ op ฉันสงสัยว่าใครมีพยายาม Cppcheck และตัดสินใจว่ามันไม่ดีด้วยเหตุผลบางอย่าง? ฉันยินดีที่จะเรียนรู้ว่าทำไม เราพยายามหลีกเลี่ยงเสียงรบกวนใน Cppcheck จริงๆ ... ฉันอ้าง @ArneVogel "ดูเหมือนจะไม่มีเครื่องมือใดสร้างขึ้นมาในหลาย ๆ กรณี" เรามีการปราบปราม แต่ถ้าคุณเห็นคำเตือนผิดพลาดขอแนะนำให้คุณรายงานเพื่อให้เราสามารถแก้ไขได้

Bathsheba 09/20/2017.

ไม่ this - b ดำเนินการ pointer arithmetic บนตัวชี้ this แม้ว่า b จะเป็นชนิด bool ( b จะแปลงเป็น int โดยปริยาย)

(ที่น่าสนใจคุณสามารถตั้งค่า this + b ไปยังตัวชี้ที่ b เป็นประเภท bool เนื่องจากคุณสามารถตั้งค่าตัวชี้ไปที่จุดสิ้นสุดของสเกลาร์ได้! ดังนั้นแม้แต่ตัวบอก undefined behaviour คุณโปรดปรานก็จะอนุญาตให้ใช้ตัวคั่นได้)

การตรวจสอบขอบเขตอาร์เรย์เป็นหน้าที่ของโปรแกรมเมอร์ C ++ เสมอ

โปรดทราบว่าในกรณีของคุณการใช้ this เป็นสิ่งจำเป็น: เพื่อลดปัญหาการใช้งานที่มากเกินไปนี้เป็นวิธีหนึ่งในการทำให้ปัญหาหายไป

5 comments
10 Bathsheba 09/20/2017
@ Caduchon: การตัดสินใจนั้นช่างโชคดีจริงๆ คุณวาดเส้นไหน? เรียกใช้ฟังก์ชันสมาชิกส่วนตัวด้วยหรือไม่?! ใช้เงินและแก้ไข ใจคุณฉันใช้ m_ สำหรับตัวแปรสมาชิกและ s_ สำหรับ statics กลับไปที่กล่องของฉัน ;-)
9 Caduchon 09/20/2017
@Bthsheba: ใช้ข้อเสนอนี้ - this-> มีการรับประกันเวลารวบรวมว่าเป็นสมาชิก ใช้ m_ หรือ s_ ไม่ป้องกันตัวแปร local / global (โชคร้าย) ที่มีชื่อว่า มันเป็นเหตุผล แต่แน่นอนว่าอาจเป็นเรื่องที่น่าสนใจที่จะเปิดการตัดสินใจนี้อีกครั้ง StackOverflow ไม่ได้เป็นแพลตฟอร์มที่ดีที่สุดเพื่อหารือเกี่ยวกับคำถามประเภทนี้ (ผมคิดว่า) ซึ่งอาจจะดีหรือไม่?
2 Oktalist 09/20/2017
ฉันสงสัยว่าคอมไพเลอร์ฉลาดพอจะส่งเสียงเตือนโดยอาศัยข้อเท็จจริงที่ว่า bool(this-n) นี้เป็นจริงเสมอ ตัวอย่างเช่นเสียงดังกราวออกคำเตือนสำหรับ bool(this) โดยนัย bool(this)
10 user2357112 09/20/2017
ฉันไม่เห็นว่าส่วนใดของคำตอบนี้เกี่ยวข้องกับคำถามเกี่ยวกับคำเตือน แน่นอนมันเลขคณิตชี้ ไม่ได้หมายความว่าไม่มีทางใดที่จะตรวจสอบได้ว่าเป็นสัญญาณรบกวนหรือสร้างคำเตือน
2 Bathsheba 09/21/2017
@snb ดู stackoverflow.com/questions/1228161/ ... ฉัน think ฉันได้รับ m_ ของฉันและ s_ เมื่อฉันเป็น s_ wee ที่ Goldman Sachs ฉันยังเห็น my เป็นคำนำหน้าสำหรับสมาชิกและเป็นคำนำหน้าสำหรับสถิตศาสตร์ ส่วนตัวแม้ว่าฉันไม่ชอบอาศัยไวยากรณ์สีเพื่อแสดงตัวแปรสมาชิก: ค่อนข้างยากที่จะกำหนดค่า vi ให้ทำ!

Simon 09/20/2017.

ฉันขอแนะนำเครื่องมืออื่น (นอกเหนือจาก cppcheck เสนอโดย @ arne-vogel) ให้ความช่วยเหลือด้านภาพที่ดีขึ้นแทนคำเตือนที่ถาม:

ใช้ รูปแบบคำบรรยาย เพื่อจัดรูปแบบโค้ดของคุณโดยอัตโนมัติ ผลลัพธ์อาจมีลักษณะดังนี้ (ขึ้นอยู่กับการตั้งค่า) ทำให้ข้อผิดพลาดปรากฏขึ้นโดยช่องว่างที่เพิ่มรอบตัว operator- :

struct A {
  bool b;
  void set(bool b_) { this->b = b_; }
  bool get() const { return this - b; }
}; 
4 comments
displayName 09/20/2017
หากคุณยังสามารถเพิ่มสีโค้ดหรือเครื่องมือระบายสีผลลัพธ์ของคอมไพเลอร์ในคำตอบได้คุณจะเพิ่มมูลค่า
Simon 09/20/2017
@displayName ฉันไม่แน่ใจว่าฉันเข้าใจคำแนะนำของคุณฉันไม่ทราบตัวแก้ไขใด ๆ หรือ IDE ที่ใช้สำหรับการพัฒนาซอฟต์แวร์ที่ไม่มีการเน้นไวยากรณ์ในระบบ
displayName 09/20/2017
ที่ทำให้ฉันรู้สึกเก่าเพราะฉันรู้ว่าไม่กี่ที่ไม่ได้เน้นไวยากรณ์อย่างน้อย nvm ฉันเป็นเพียงบอกว่าถ้าคุณจะใช้ความช่วยเหลือในการจัดรูปแบบรหัสเพื่อจับปัญหา (ซึ่งเป็นวิธีที่ดี IMO) จากนั้นใช้การจัดรูปแบบของการรวบรวมผล ฯลฯ รวมทั้งการจับนี้เป็นข้อผิดพลาดที่อาจเกิดขึ้นอื่น ๆ
Caduchon 09/20/2017
ความคิดที่ดี. แต่จริงๆแล้วฉันเกลียดเมื่อแก้ไขรูปแบบรหัสของฉัน เหตุผลหลายประการ (โง่) ฉันตัดสินใจที่จะจัดรูปแบบตามกฎหรืออื่นในขณะนี้เพื่อเหตุผลในการอ่านเหตุผลด้านสุนทรียศาสตร์ด้วยเหตุผลทางประวัติศาสตร์ ... ฉันชอบที่จะควบคุมสิ่งนี้ โดยวิธีการที่ฉันมีตัวแก้ไขทำ auto - จบ precompiling การจัดรูปแบบเน้น ... มันเป็นรหัสง่ายๆเขียนได้อย่างรวดเร็วมากก็เพียงความผิดพลาดของฉัน

Richard Hodges 09/20/2017.

ไม่ได้ไม่มีทางใดที่จะได้รับคำเตือน อนุญาตให้ใช้ภาษาได้โดยปริยายการแปลงแม้ว่าจะดื้อด้าน

อย่างไรก็ตามในกรณีการใช้งานเฉพาะนี้เราสามารถทำได้ดีกว่าโดยการห่อ bool ในคลาส wrapper ซึ่งมี Conversion ที่ชัดเจนและไม่มีการดำเนินการเลขคณิตที่กำหนดไว้

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

เป็นที่น่าสนใจที่จะทราบว่า c ++ 17 เลิกใช้ bool::operator++ เนื่องจากการคำนวณนี้เป็นความชั่วร้าย

ตัวอย่าง:

struct Bool
{
    explicit Bool(bool b) : value_(b) {}
    explicit operator bool() const { return value_; }
private:
    bool value_;

    // define only the operators you actually want
    friend std::ostream& operator<<(std::ostream& os, const Bool& b) {
        return os << b;
    }
};

struct X
{
    bool foo() {
        // compilation failure - no arithemetic operators defined.
        // return bool(this-b);

        // explicit conversion is fine
        return bool(b);
    }

    Bool b { true }; // explicit initialisation fine
}; 
5 comments
3 BЈовић 09/20/2017
คุณอ่านคำถามหรือไม่?
2 Caduchon 09/20/2017
แล้วฉันยังต้องสร้าง std::vector ลดหน่วยความจำ? ก็เห็นได้ชัดว่าไม่ใช่ทางออก ฉันไม่ต้องการเปลี่ยนประเภทพื้นฐานในโค้ดทั้งหมดของฉัน ...
5 Caduchon 09/20/2017
วุ้นเส้นรับแต่งชาคริตเม. ย. ปี ...
3 Caduchon 09/20/2017
@RichardHodges: ฉันขอคำเตือนสำหรับคอมไพเลอร์อย่างชัดแจ้ง
5 Martin Bonner 09/20/2017
"ไม่มีไม่มีทางใดที่จะได้รับการเตือนการแปลงโดยนัยแม้ว่าจะดื้อดึงก็ตามได้รับอนุญาตจากภาษานี้" นั่นคือไม่ใช่ sequitur คำเตือนหลายคำ (ทั้งหมด) ใช้สำหรับสิ่งต่างๆที่ได้รับอนุญาตโดยภาษา แต่อาจเป็นข้อผิดพลาด ตัวอย่างเช่น if (a = f()) จะสร้างคำเตือนสำหรับคอมไพเลอร์จำนวนมาก (ซึ่งจะถูกปิดโดย if ((a = f()))

HighResolutionMusic.com - Download Hi-Res Songs

1 (G)I-DLE

POP/STARS flac

(G)I-DLE. 2018. Writer: Riot Music Team;Harloe.
2 Ariana Grande

​Thank U, Next flac

Ariana Grande. 2018. Writer: Crazy Mike;Scootie;Victoria Monét;Tayla Parx;TBHits;Ariana Grande.
3 Imagine Dragons

Bad Liar flac

Imagine Dragons. 2018. Writer: Jorgen Odegard;Daniel Platzman;Ben McKee;Wayne Sermon;Aja Volkman;Dan Reynolds.
4 Backstreet Boys

Chances flac

Backstreet Boys. 2018.
5 Clean Bandit

Baby flac

Clean Bandit. 2018. Writer: Jack Patterson;Kamille;Jason Evigan;Matthew Knott;Marina;Luis Fonsi.
6 BTS

Waste It On Me flac

BTS. 2018. Writer: Steve Aoki;Jeff Halavacs;Ryan Ogren;Michael Gazzo;Nate Cyphert;Sean Foreman;RM.
7 BlackPink

Kiss And Make Up flac

BlackPink. 2018. Writer: Soke;Kny Factory;Billboard;Chelcee Grimes;Teddy Park;Marc Vincent;Dua Lipa.
8 Lady Gaga

I'll Never Love Again flac

Lady Gaga. 2018. Writer: Benjamin Rice;Lady Gaga.
9 Kelly Clarkson

Never Enough flac

Kelly Clarkson. 2018. Writer: Benj Pasek;Justin Paul.
10 Fitz And The Tantrums

HandClap flac

Fitz And The Tantrums. 2017. Writer: Fitz And The Tantrums;Eric Frederic;Sam Hollander.
11 Little Mix

Told You So flac

Little Mix. 2018. Writer: Eyelar;MNEK;Raye.
12 Halsey

Without Me flac

Halsey. 2018. Writer: Halsey;Delacey;Louis Bell;Amy Allen;Justin Timberlake;Timbaland;Scott Storch.
13 Cher Lloyd

None Of My Business flac

Cher Lloyd. 2018. Writer: ​iamBADDLUCK;Alexsej Vlasenko;Kate Morgan;Henrik Meinke;Jonas Kalisch;Jeremy Chacon.
14 Bradley Cooper

Always Remember Us This Way flac

Bradley Cooper. 2018. Writer: Lady Gaga;Dave Cobb.
15 Calum Scott

No Matter What flac

Calum Scott. 2018. Writer: Toby Gad;Calum Scott.
16 Ashley Tisdale

Voices In My Head flac

Ashley Tisdale. 2018. Writer: John Feldmann;Ashley Tisdale.
17 Imagine Dragons

Machine flac

Imagine Dragons. 2018. Writer: Wayne Sermon;Daniel Platzman;Dan Reynolds;Ben McKee;Alex Da Kid.
18 Diplo

Close To Me flac

Diplo. 2018. Writer: Ellie Goulding;Savan Kotecha;Peter Svensson;Ilya;Swae Lee;Diplo.
19 Billie Eilish

When The Party's Over flac

Billie Eilish. 2018. Writer: Billie Eilish;FINNEAS.
20 Little Mix

Woman Like Me flac

Little Mix. 2018. Writer: Nicki Minaj;Steve Mac;Ed Sheeran;Jess Glynne.

Related questions

Hot questions

Language

Popular Tags