From e561e2465c5c58736df53371638ca77529035040 Mon Sep 17 00:00:00 2001 From: Suboptimal Engineer Date: Tue, 14 Oct 2025 17:15:15 -0400 Subject: [PATCH 1/3] Do make clean, update readme, and add template. --- 000-template/README.md | 33 +++++++++++++ 010-ub-for-uninitialized-var/README.md | 10 ++-- 010-ub-for-uninitialized-var/main | Bin 22736 -> 0 bytes .../main.dSYM/Contents/Info.plist | 20 -------- .../main.dSYM/Contents/Resources/DWARF/main | Bin 106888 -> 0 bytes .../Resources/Relocations/x86_64/main.yml | 5 -- 011-lldb-init-settings/Makefile | 5 ++ 011-lldb-init-settings/README.md | 44 ++++++++++++++++++ 011-lldb-init-settings/main.cpp | 9 ++++ 9 files changed, 96 insertions(+), 30 deletions(-) create mode 100644 000-template/README.md delete mode 100755 010-ub-for-uninitialized-var/main delete mode 100644 010-ub-for-uninitialized-var/main.dSYM/Contents/Info.plist delete mode 100644 010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/DWARF/main delete mode 100644 010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/Relocations/x86_64/main.yml create mode 100644 011-lldb-init-settings/Makefile create mode 100644 011-lldb-init-settings/README.md create mode 100644 011-lldb-init-settings/main.cpp diff --git a/000-template/README.md b/000-template/README.md new file mode 100644 index 0000000..6dcbacd --- /dev/null +++ b/000-template/README.md @@ -0,0 +1,33 @@ +# UB - Uninitialized Local Variable + +## TL;DR + +- In the C++ on Sea keynote, Herb Sutter showed some code with undefined behavior in C++ +- Turns out that C++ can have UB when reading a local variable that is uninitalized +- I was confused by this and decided to investigate further by looking into the assembly code +- The point of this investigation is to learn what's happening under the hood in the compiler +- (Note that this issue will be fixed by default in C++ 26 which is great!) + +## Video Overview + +- Start by recreating the C++ code from Herb's slide +- Go over the C++ code and explain what we expect to happen vs what actually happens +- Run the code to ensure the undefined behavior (as expected :P) +- Turn on `ftrivial-auto-var-init=zero` flag and confirm that UB is NOT there anymore + - This flag basically ensures that + - These flags are default to true in C++ 26 + - So we can expect them to be gone with no code changes in the future +- Investigate the assembly for UB code +- Investigate the assembly diff for non-UB code + +## Helpful LLDB Commands + +## Sample Assembly Code + +## Titles + +## References + +- Herb Sutter's Keynote at C++ on Sea - https://www.youtube.com/watch?v=kKbT0Vg3ISw +- Herb Sutter's Website - https://herbsutter.com/ +- ChatGPT and Gemini diff --git a/010-ub-for-uninitialized-var/README.md b/010-ub-for-uninitialized-var/README.md index bc5dc99..f12331e 100644 --- a/010-ub-for-uninitialized-var/README.md +++ b/010-ub-for-uninitialized-var/README.md @@ -73,13 +73,13 @@ main`f1: # Process 4758 stopped ``` +## Titles + +- How C++ 26 Fixes Undefined Behavior for Unintialized Local Variables +- How C++ Prevents Undefined Behavior for Uninitialized Local Variables + ## References - Herb Sutter's Keynote at C++ on Sea - https://www.youtube.com/watch?v=kKbT0Vg3ISw - Herb Sutter's Website - https://herbsutter.com/ - ChatGPT and Gemini (if these count) - -## Title - -- How C++ 26 Fixes Undefined Behavior for Unintialized Local Variables -- How C++ Prevents Undefined Behavior for Uninitialized Local Variables diff --git a/010-ub-for-uninitialized-var/main b/010-ub-for-uninitialized-var/main deleted file mode 100755 index 765d6ed37fc8981c0de7a25676105e815469618c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22736 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 diff --git a/010-ub-for-uninitialized-var/main.dSYM/Contents/Info.plist b/010-ub-for-uninitialized-var/main.dSYM/Contents/Info.plist deleted file mode 100644 index fe7fecd..0000000 --- a/010-ub-for-uninitialized-var/main.dSYM/Contents/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleIdentifier - com.apple.xcode.dsym.main - CFBundleInfoDictionaryVersion - 6.0 - CFBundlePackageType - dSYM - CFBundleSignature - ???? - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - - diff --git a/010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/DWARF/main b/010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/DWARF/main deleted file mode 100644 index d816b433094d5793e893a8a582c3f81860a5acd4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106888 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 diff --git a/010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/Relocations/x86_64/main.yml b/010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/Relocations/x86_64/main.yml deleted file mode 100644 index ff6f0d2..0000000 --- a/010-ub-for-uninitialized-var/main.dSYM/Contents/Resources/Relocations/x86_64/main.yml +++ /dev/null @@ -1,5 +0,0 @@ ---- -triple: 'x86_64-apple-darwin' -binary-path: main -relocations: [] -... diff --git a/011-lldb-init-settings/Makefile b/011-lldb-init-settings/Makefile new file mode 100644 index 0000000..6d777e8 --- /dev/null +++ b/011-lldb-init-settings/Makefile @@ -0,0 +1,5 @@ +all: + clang++ -std=c++17 -g main.cpp -o main + +clean: + rm -rf main *.dSYM \ No newline at end of file diff --git a/011-lldb-init-settings/README.md b/011-lldb-init-settings/README.md new file mode 100644 index 0000000..433c006 --- /dev/null +++ b/011-lldb-init-settings/README.md @@ -0,0 +1,44 @@ +# LLDB Init Settings + +## TL;DR + +- It is tedious to set up LLDB commands every time you compile C++ code (or re-open LLDB) +- For example, you may need to run these 2 commands on restart (every time) + - `b main` (break point at main) + - `target stop-hook add -o "disassemble"` (show assembly) +- You can avoid this repetitive process by adding creating the `~/.lldbinit` file + +## Video Overview + +- Go over sample C++ code +- Show how to run LLDB by using `-g` compiler flag +- Show the need for using `b main` and `target stop-hook add -o "disassemble"` +- Change code, recompile, re-run LLDB, and notice that the settings are lost +- Show how setting up the `~/.lldbinit` file solves this problem + +## LLDB Init Settings + +- Add this to `~/.lldbinit` file + +```bash +# file -> ~/.lldbinit + +# break point at main +breakpoint set --name main + +# show assembly by default +target stop-hook add -o "disassemble" + +# use this instead if you want to see 10 lines of assembly at program counter +# target stop-hook add -o "disassemble --pc --count 10" +``` + +## Titles + +- How to Improve LLDB Debugger Developer Experience? +- How to Improve LLDB (gdb) Developer Experience for Debugging? +- How to Improve LLDB (GDB) Developer Experience with Custom Settings + +## References + +- ChatGPT diff --git a/011-lldb-init-settings/main.cpp b/011-lldb-init-settings/main.cpp new file mode 100644 index 0000000..583ddf8 --- /dev/null +++ b/011-lldb-init-settings/main.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + int a = 1; + int b = 5; + int c = 6; + printf("sum -> %d\n", a + b); + return 0; +} \ No newline at end of file From e44bb4672ab642c53087776e2d4b2f52a9c70e5f Mon Sep 17 00:00:00 2001 From: Suboptimal Engineer Date: Tue, 14 Oct 2025 17:17:54 -0400 Subject: [PATCH 2/3] Add make file and update main.cpp example code. --- 000-template/Makefile | 5 +++++ 000-template/main.cpp | 9 +++++++++ 2 files changed, 14 insertions(+) create mode 100644 000-template/Makefile create mode 100644 000-template/main.cpp diff --git a/000-template/Makefile b/000-template/Makefile new file mode 100644 index 0000000..6d777e8 --- /dev/null +++ b/000-template/Makefile @@ -0,0 +1,5 @@ +all: + clang++ -std=c++17 -g main.cpp -o main + +clean: + rm -rf main *.dSYM \ No newline at end of file diff --git a/000-template/main.cpp b/000-template/main.cpp new file mode 100644 index 0000000..379feb9 --- /dev/null +++ b/000-template/main.cpp @@ -0,0 +1,9 @@ +#include + +int main() { + int a = 1; + int b = 2; + int c = 5; + std::cout << "sum -> " << a + b + c << std::endl; + return 0; +} \ No newline at end of file From 48839d6dc731dd635b56b72b9ca39dfdafe7c7ab Mon Sep 17 00:00:00 2001 From: Suboptimal Engineer Date: Tue, 14 Oct 2025 17:21:41 -0400 Subject: [PATCH 3/3] Add new line at eof. --- 000-template/Makefile | 2 +- 000-template/main.cpp | 2 +- 011-lldb-init-settings/Makefile | 2 +- 011-lldb-init-settings/main.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/000-template/Makefile b/000-template/Makefile index 6d777e8..d14ed9e 100644 --- a/000-template/Makefile +++ b/000-template/Makefile @@ -2,4 +2,4 @@ all: clang++ -std=c++17 -g main.cpp -o main clean: - rm -rf main *.dSYM \ No newline at end of file + rm -rf main *.dSYM diff --git a/000-template/main.cpp b/000-template/main.cpp index 379feb9..a41fdca 100644 --- a/000-template/main.cpp +++ b/000-template/main.cpp @@ -6,4 +6,4 @@ int main() { int c = 5; std::cout << "sum -> " << a + b + c << std::endl; return 0; -} \ No newline at end of file +} diff --git a/011-lldb-init-settings/Makefile b/011-lldb-init-settings/Makefile index 6d777e8..d14ed9e 100644 --- a/011-lldb-init-settings/Makefile +++ b/011-lldb-init-settings/Makefile @@ -2,4 +2,4 @@ all: clang++ -std=c++17 -g main.cpp -o main clean: - rm -rf main *.dSYM \ No newline at end of file + rm -rf main *.dSYM diff --git a/011-lldb-init-settings/main.cpp b/011-lldb-init-settings/main.cpp index 583ddf8..0eb4d70 100644 --- a/011-lldb-init-settings/main.cpp +++ b/011-lldb-init-settings/main.cpp @@ -6,4 +6,4 @@ int main() { int c = 6; printf("sum -> %d\n", a + b); return 0; -} \ No newline at end of file +}