คำถามติดแท็ก static-code-analysis

2
จะหาการคัดลอกปลอมแบบ C ++ ได้อย่างไร?
เมื่อเร็ว ๆ นี้ฉันมีดังต่อไปนี้ struct data { std::vector<int> V; }; data get_vector(int n) { std::vector<int> V(n,0); return {V}; } ปัญหาของรหัสนี้คือเมื่อโครงสร้างถูกสร้างสำเนาเกิดขึ้นและวิธีแก้ไขคือแทนที่จะเขียนreturn {std :: move (V)} มีตัววิเคราะห์ linter หรือ code ที่ตรวจจับการดำเนินการคัดลอกปลอมหรือไม่ cppcheck, cpplint และ clang-tidy ไม่สามารถทำได้ แก้ไข: มีหลายประเด็นที่ทำให้คำถามของฉันชัดเจนขึ้น: ฉันรู้ว่าดำเนินการคัดลอกเกิดขึ้นเพราะผมเคยสำรวจคอมไพเลอร์และมันแสดงให้เห็นว่าการเรียกไปยังmemcpy ฉันสามารถระบุได้ว่าการคัดลอกเกิดขึ้นโดยดูจากมาตรฐานใช่ แต่ความคิดที่ผิดพลาดครั้งแรกของฉันคือคอมไพเลอร์จะทำสำเนานี้ให้เหมาะสมที่สุด ฉันผิดไป. มันเป็น (น่าจะ) ไม่เป็นปัญหาคอมไพเลอร์เนื่องจากทั้งสองเสียงดังกราวและ GCC รหัสผลิตผลที่ผลิตmemcpy memcpy อาจจะถูก แต่ฉันไม่สามารถจินตนาการสถานการณ์ที่คัดลอกหน่วยความจำและการลบเดิมมีราคาถูกกว่าการส่งผ่านตัวชี้โดยมาตรฐาน :: ย้าย การเพิ่มstd …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.