SlideShare a Scribd company logo
Hypercritical C++ Code Review
Yuri Minaev
minev@viva64.com
2
A C++ developer at PVS-
Studio.
Working on the core
functionality and diagnostic
rules of the C/C++ static code
analyzer.
About me
3
• We all do code reviews
• Who doesn't admit this – does it twice as often
• It's ok, nobody's gonna blame you
• Just make sure, you take precautions
What is this about?
4
• We all do code reviews
• Who doesn't admit this –
does it twice as often
• It's ok, nobody's gonna blame
you
• Just make sure, you take
precautions
What are you talking about?
5
Aut'o'matic
6
void foo(const std::vector<....> &vec)
{
for (auto i = 0; i < vec.size(); ++i)
{
// do some magic with vec[i]
}
}
int i = 0;
7
void foo(const std::vector<....> &vec)
{
for (auto i = 0; i < vec.size(); ++i)
{
// do some magic with vec[i]
}
}
Bad for x64
8
void foo(const std::vector<....> &vec)
{
for (auto i = 0; i < vec.size(); ++i)
{
// do some magic with vec[i]
}
} Signed/unsigned
mixup
9
void foo(const std::vector<....> &vec)
{
for (size_t i = 0; i < vec.size(); ++i)
{
// do some magic with vec[i]
}
}
Better
10
void foo(const std::vector<....> &vec)
{
for (auto i = 0ull; i < vec.size(); ++i)
{
// do some magic with vec[i]
}
}
128-bit systems, anyone?
11
void foo(const std::vector<....> &vec)
{
for (auto&& item : vec)
{
// do some magic with item
}
}
Look, I fixed it
12
Misreference
13
auto other =
static_cast<const Self &>(rhs_);
const T &a = data[n];
const T &b = other.data[m];
// Do stuff
:(
14
auto& other =
static_cast<const Self &>(rhs_);
const T &a = data[n];
const T &b = other.data[m];
// Do stuff
Look, I fixed it
15
decltype(auto) other =
static_cast<const Self &>(rhs_);
const T &a = data[n];
const T &b = other.data[m];
// Do stuff
If you're really into it
16
Thou shalt not auto, unless thy faith is strong and
pure
17
18
Versus Intuition
19
using V = std::vector<....>;
void vector_inc(V &v)
{
for (size_t i = 0; i < v.size(); i++)
{
v[i]++;
}
}
20
for (size_t i = 0; i < v.size(); i++)
{
v[i]++;
}
std::vector<uint32_t> &v;
std::vector<uint8_t> &v;
Which is faster?
21
Let's benchmark, shall we?
Compiler Element -O1 -O2 -O3
gcc 8 uint8_t 2.0 2.0 2.0
gcc 8 uint32_t 2.3 1.3 0.2
clang 8 uint8_t 9.2 2.0 2.0
clang 8 uint32_t 9.2 0.2 0.2
22
23
24
25
// using V = std::vector<uint8_t>;
auto it = v.begin();
const auto end = v.end();
for (; it != end; ++it)
{
++(*it);
}
26
27
One more (with uint8_t)
Compiler Before (-O2) After (-O2) Speedup
gcc 8 2.0 1.3 1.5x
clang 8 2.0 0.06 33.4x
28
auto it = v.begin();
const auto end = v.end();
for (; it != end; ++it)
{
++(*it);
}
Does it remind you of anything?
29
for (auto&& elem : v)
{
++elem;
}
How about this?
30
31
Thou shalt not write indexed loops for they are
abomination before the Code
32
33
Privacy Matters
34
void InputPassword(char *pswd);
void ProcessPassword(const char *pswd);
void DoSomething()
{
char password[MAX_PASSWORD_LEN];
InputPassword(password);
ProcessPassword(password);
memset(password, 0, sizeof(password));
}
35
What does the compiler say?
clang 10 with –O2
36
Looks contrived?
37
• Custom safe_memset + disabled LTO/WPO
• Access a non-volatile object through a volatile pointer
• Call memset through a volatile function pointer
• Volatile assembly code
• Memset + memory barrier
• Disable compiler optimisations (-fno-builtin-memset)
• C11: memset_s
So, what can you do?
38
Thou shalt wash thy data thoroughly before releasing
it
39
Unwashed Data
40
if (!fgets(readbuf, BUFSIZ, stdin))
{
// ....
}
if(readbuf[strlen(readbuf) - 1] == 'n')
readbuf[strlen(readbuf) - 1] = '0';
CVE-2015-8948
41
if (!fgets(readbuf, BUFSIZ, stdin))
{
// ....
}
if(readbuf[strlen(readbuf) - 1] == 'n')
readbuf[strlen(readbuf) - 1] = '0';
Put an empty line here
This goes BOOM
42
if (getline(&line, &linelen, stdin)
== -1)
{
// ....
}
if(line[strlen(line) - 1] == 'n')
line[strlen(line) - 1] = '0';
Look, I fixed it
43
if (getline(&line, &linelen, stdin)
== -1)
{
// ....
}
if(line[strlen(line) - 1] == 'n')
line[strlen(line) - 1] = '0';
CVE-2016-6262
44
if (getline(&line, &linelen, stdin)
== -1)
{
// ....
}
if(line[strlen(line) - 1] == 'n')
line[strlen(line) - 1] = '0';
Put an empty line here
This goes BOOM
45
Thou shalt not accept data from strangers for they
might be sinful
46
Last Mile
47
void Init( float ix=0, float iy=0,
float iz=0, float iw=0 )
{
SetX( ix );
SetY( iy );
SetZ( iz );
SetZ( iw );
}
SetW( iw );
48
if (access & FILE_WRITE_ATTRIBUTES)
output.append("tFILE_WRITE_ATTRIBUTESn");
if (access & FILE_WRITE_DATA)
output.append("tFILE_WRITE_DATAn");
if (access & FILE_WRITE_EA)
output.append("tFILE_WRITE_EAn");
if (access & FILE_WRITE_EA)
output.append("tFILE_WRITE_EAn");
Same blocks
49
if (
protocol.EqualsIgnoreCase("http") ||
protocol.EqualsIgnoreCase("https") ||
protocol.EqualsIgnoreCase("news") ||
protocol.EqualsIgnoreCase("ftp") ||
protocol.EqualsIgnoreCase("file") ||
protocol.EqualsIgnoreCase("javascript") ||
protocol.EqualsIgnoreCase("ftp")
) {
Double checking
50
Thou shalt not copy-paste thy code blocks
51
52
Have Spaceship, Will Travel
<=>
53
struct Foo
{
int a, b;
};
bool operator==(Foo lhs, Foo rhs)
{
return lhs.a == rhs.a
&& lhs.b == rhs.b;
}
54
struct Foo
{
int a, b;
};
bool operator!=(Foo lhs, Foo rhs)
{
return !(lhs == rhs);
}
bool operator==(Foo lhs, Foo rhs)
{
return lhs.a == rhs.a && lhs.b == rhs.b;
}
So far so good
55
bool operator<(Foo lhs, Foo rhs) { ??? }
bool operator<=(Foo lhs, Foo rhs) { ??? }
bool operator>(Foo lhs, Foo rhs) { ??? }
bool operator>=(Foo lhs, Foo rhs) { ??? }
How about these?
56
bool operator<(Foo lhs, Foo rhs)
{
return lhs.a < rhs.a
&& lhs.b < rhs.b;
}
So far so good
57
bool operator<(Foo lhs, Foo rhs)
{
return lhs.a < rhs.a
&& lhs.b < rhs.b;
}
Foo { 2, 1 } < Foo { 1, 2 }
Foo { 1, 2 } < Foo { 2, 1 }
false
false
58
bool operator<(Foo lhs, Foo rhs)
{
if (lhs.a < rhs.a) return true;
if (rhs.a < lhs.a) return false;
return lhs.b < rhs.b;
}
Foo { 2, 1 } < Foo { 1, 2 }
Foo { 1, 2 } < Foo { 2, 1 }
false
true
59
struct Foo
{
double a;
};
bool operator<(Foo lhs, Foo rhs)
{
return lhs.a < rhs.a;
}
bool operator>=(Foo lhs, Foo rhs)
{
return !(lhs < rhs);
}
60
Foo { 1.0 } < Foo { 2.0 }
Foo { 1.0 } < Foo { NaN }
true
false
bool operator<(Foo lhs, Foo rhs)
{
return lhs.a < rhs.a;
}
bool operator>=(Foo lhs, Foo rhs)
{
return !(lhs < rhs);
}
Foo { 1.0 } >= Foo { NaN } true
61
So, what shall we do?
struct Foo
{
// anything
auto operator<=>(const Foo &rhs) const = default;
};
62
Foo { 1.0 } < Foo { 2.0 }
Foo { 1.0 } < Foo { NaN }
true
false
struct Foo
{
// anything
auto operator<=>(const Foo &rhs) const = default;
};
Foo { 1.0 } >= Foo { NaN } false
Foo { 2, 1 } < Foo { 1, 2 }
Foo { 1, 2 } < Foo { 2, 1 }
false
true
63
While we're at it
64
const Ptree* pIf =
IsA(p, ntIfStatement, ntSwitchStatement)
? p
: IsA(First(p),
ntIfStatement, ntSwitchStatement)
&& ContainsNoReturnStatements(First(p))
? First(p)
: nullptr;
65
const Ptree* pIf =
IsA(p, ntIfStatement, ntSwitchStatement)
? p
: IsA(First(p),
ntIfStatement, ntSwitchStatement)
&& ContainsNoReturnStatements(First(p))
? First(p)
: nullptr;
66
Thy comparison routines shall be correct or else the
Wrath of Code will get thee
67
Don't Push on Me
68
struct G584_Info
{
G584_Info(/*A bunch of params*/)
{/**/}
const Ptree *m_p;
bool m_add, m_mul;
bool m_sub, m_div;
};
69
auto what = p->What();
if (what == ntParenExpr)
{
// infs is std::vector<G584_Info>&
infs.push_back(
G584_Info(p, true, true, false, false)
);
p = SafeSkipParentesis(p);
} Possible copy
70
auto what = p->What();
if (what == ntParenExpr)
{
// infs is std::vector<G584_Info>&
infs.emplace_back(
p, true, true, false, false
);
p = SafeSkipParentesis(p);
} Better
71
struct G584_Info
{
G584_Info(/*A bunch of params*/)
{/**/}
const Ptree *m_p;
bool m_add, m_mul;
bool m_sub, m_div;
};
emplace_back this?
yes, since C++20
72
Thou shalt not push that which can be emplaced
73
Find It Again
74
auto&& infoMap = GetFunctionDangerousInfoMap();
auto it = infoMap.find(funcInfo);
if (it == infoMap.end())
{
infoMap.insert(
std::make_pair(funcInfo, dangerousInfo));
}
else
{
auto&& a = it->second;
}
Here we go again
75
auto it = infoMap.find(funcInfo);
if (it == infoMap.end())
{
infoMap.emplace(funcInfo, dangerousInfo);
}
else
{
auto&& a = it->second;
}
Better?
76
auto it = infoMap.find(funcInfo);
if (it == infoMap.end())
{
infoMap.emplace(funcInfo,
dangerousInfo);
}
else
{
auto&& a = it->second;
} Double lookup
77
if (auto [it, success] =
infoMap.try_emplace(funcInfo,
dangerousInfo);
!success)
{
auto&& a = it->second;
}
Look, I fixed it
78
Thou shalt search only once
79
80
Mind The Sign
81
gcc is <ILLEGIBLE> broken
As I understand it, those <BEEP>ing <BAD PEOPLE>
decided to <ILLEGIBLE> break everything again. It
worked before and now it's broken.
For example, dropping the sign (a & 0x7fffffff)
doesn't <BLEEP>ing work, and nothing works no
more.
They always <FLIP>ing break everything, those
<CENSORED>s. Take your <WEEP>ing UB and <...>
82
int foo(const char *s)
{
int r = 0;
while (*s)
{
r += ((r * 20891 + *s * 200)
| *s ^ 4 | *s ^ 3 )
^ (r >> 1);
s++;
}
return r & 0x7fffffff;
}
Signed
Overflow
Drop the sign
83
foo(char const*):
movzx edx, BYTE PTR [rdi]
test dl, dl
je .L4
xor esi, esi
.L3:
; lots of calculations
jne .L3
mov eax, esi
and eax, 2147483647
ret
.L4:
xor eax, eax
ret
Drop the sign
84
int foo(const char *s)
{
int r = 0;
while (*s)
{
r += ((r * 20891 + *s * 200)
| *s ^ 4 | *s ^ 3 )
^ (r >> 1);
s++;
}
return r & 0x7fffffff;
}
gcc -O2 -std=c++17 -funsigned-char
85
foo(char const*):
movzx edx, BYTE PTR [rdi]
xor r8d, r8d
test dl, dl
je .L1
.L3:
; lots of calculations
jne .L3
.L1:
mov eax, r8d
ret
Oops
86
Thou shalt not cook signed values with overflow
semantics
87
Throwing Out
noexcept(BOOM)
88
void func() noexcept
{
// ....
throw SomeException{};
}
This is REALLY bad
89
void func() noexcept
{
anotherFunc();
}
This is also REALLY bad
void anotherFunc()
{
throw SomeException{};
}
90
Not noexcept, but implies so
DllMain
91
BOOL WINAPI DllMain(/**/)
{
BOOL br = TRUE;
// ....
if (FAILED(DllRegisterServer()))
br = FALSE;
// ....
return br;
}
92
BOOL WINAPI DllMain(/**/)
{
BOOL br = TRUE;
// ....
if (FAILED(DllRegisterServer()))
br = FALSE;
// ....
return br;
}
PVS-Studio: don't throw from
DllMain, mate
93
BOOL WINAPI DllMain(/**/)
{
BOOL br = TRUE;
// ....
if (FAILED(DllRegisterServer()))
br = FALSE;
// ....
return br;
}
PVS-Studio: don't throw from
DllMain, mate
Me: LOLWUT?
94
• Part of Window API
• Essentially, written in C
• Related to COM
• Doesn't throw
DllRegisterServer
Looks buggy
Or does it?
95
HRESULT WINAPI DllRegisterServer(VOID)
{
// ....
hr = ::RegOpenKeyEx(/**/);
// ....
DllGetObjectInfo(/**/);
// ....
hr = ::RegSetValueEx(/**/);
// ....
RegCloseKey(hk);
}
These don't throw
96
HRESULT WINAPI DllGetObjectInfo(/**/)
{
// ....
hr = DllGetObject(/**/);
if (SUCCEEDED(hr))
{
// ....
delete pPlugin;
}
// ....
}
97
HRESULT WINAPI DllGetObject(
DWORD dwPluginId,
IShellPlugin **ppPlugin)
{
// ....
*ppPlugin = new CCommandPlugin;
// ....
}
98
He who is without noexcept shall throw, and none
other
QUESTIONS
99

More Related Content

What's hot (19)

PPT
Евгений Крутько, Многопоточные вычисления, современный подход.
Platonov Sergey
 
PDF
第一回 冬のスイッチ大勉強会 - XBee編 -
Wataru Kani
 
PDF
Anomalies in X-Ray Engine
PVS-Studio
 
PDF
Explanations to the article on Copy-Paste
PVS-Studio
 
TXT
Layer 2221 1 Subidazbuka
wnal
 
PDF
How to not write a boring test in Golang
Dan Tran
 
DOCX
Advance java
Vivek Kumar Sinha
 
DOCX
NVT MD
Amin Salehi
 
KEY
openFrameworks 007 - 3D
roxlu
 
PDF
Антон Бикинеев, Writing good std::future&lt; C++ >
Sergey Platonov
 
PDF
Java, Up to Date Sources
輝 子安
 
DOC
COMPUTER GRAPHICS LAB MANUAL
Vivek Kumar Sinha
 
ZIP
Learning from 6,000 projects mining specifications in the large
CISPA Helmholtz Center for Information Security
 
PDF
Kirk Shoop, Reactive programming in C++
Sergey Platonov
 
PDF
ipython notebook poc memory forensics
Vincent Ohprecio
 
PPTX
Pro typescript.ch03.Object Orientation in TypeScript
Seok-joon Yun
 
PDF
Welcome to Modern C++
Seok-joon Yun
 
DOCX
Graphics practical lab manual
Vivek Kumar Sinha
 
DOC
SE Computer, Programming Laboratory(210251) University of Pune
Bhavesh Shah
 
Евгений Крутько, Многопоточные вычисления, современный подход.
Platonov Sergey
 
第一回 冬のスイッチ大勉強会 - XBee編 -
Wataru Kani
 
Anomalies in X-Ray Engine
PVS-Studio
 
Explanations to the article on Copy-Paste
PVS-Studio
 
Layer 2221 1 Subidazbuka
wnal
 
How to not write a boring test in Golang
Dan Tran
 
Advance java
Vivek Kumar Sinha
 
NVT MD
Amin Salehi
 
openFrameworks 007 - 3D
roxlu
 
Антон Бикинеев, Writing good std::future&lt; C++ >
Sergey Platonov
 
Java, Up to Date Sources
輝 子安
 
COMPUTER GRAPHICS LAB MANUAL
Vivek Kumar Sinha
 
Learning from 6,000 projects mining specifications in the large
CISPA Helmholtz Center for Information Security
 
Kirk Shoop, Reactive programming in C++
Sergey Platonov
 
ipython notebook poc memory forensics
Vincent Ohprecio
 
Pro typescript.ch03.Object Orientation in TypeScript
Seok-joon Yun
 
Welcome to Modern C++
Seok-joon Yun
 
Graphics practical lab manual
Vivek Kumar Sinha
 
SE Computer, Programming Laboratory(210251) University of Pune
Bhavesh Shah
 

Similar to Hypercritical C++ Code Review (20)

PDF
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
PVS-Studio
 
PDF
"Why is there no artificial intelligence yet?" Or, analysis of CNTK tool kit ...
PVS-Studio
 
PDF
Checking Clang 11 with PVS-Studio
Andrey Karpov
 
PDF
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
PVS-Studio
 
PDF
Analysis of Godot Engine's Source Code
PVS-Studio
 
PPTX
C++ Code as Seen by a Hypercritical Reviewer
Andrey Karpov
 
PDF
How to make a large C++-code base manageable
corehard_by
 
PDF
How to avoid bugs using modern C++
PVS-Studio
 
PDF
A Spin-off: CryEngine 3 SDK Checked with CppCat
Andrey Karpov
 
PDF
Tesseract. Recognizing Errors in Recognition Software
Andrey Karpov
 
PPTX
Static analysis of C++ source code
Andrey Karpov
 
PPTX
Static analysis of C++ source code
PVS-Studio
 
PDF
Grounded Pointers
Andrey Karpov
 
PDF
PVS-Studio delved into the FreeBSD kernel
PVS-Studio
 
PDF
Secure Programming Practices in C++ (NDC Security 2018)
Patricia Aas
 
PDF
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
PVS-Studio
 
PPTX
A scrupulous code review - 15 bugs in C++ code
PVS-Studio LLC
 
PPTX
What has to be paid attention when reviewing code of the library you develop
Andrey Karpov
 
PDF
100 bugs in Open Source C/C++ projects
Andrey Karpov
 
PDF
Zero, one, two, Freddy's coming for you
Andrey Karpov
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 2
PVS-Studio
 
"Why is there no artificial intelligence yet?" Or, analysis of CNTK tool kit ...
PVS-Studio
 
Checking Clang 11 with PVS-Studio
Andrey Karpov
 
Analysis of Haiku Operating System (BeOS Family) by PVS-Studio. Part 1
PVS-Studio
 
Analysis of Godot Engine's Source Code
PVS-Studio
 
C++ Code as Seen by a Hypercritical Reviewer
Andrey Karpov
 
How to make a large C++-code base manageable
corehard_by
 
How to avoid bugs using modern C++
PVS-Studio
 
A Spin-off: CryEngine 3 SDK Checked with CppCat
Andrey Karpov
 
Tesseract. Recognizing Errors in Recognition Software
Andrey Karpov
 
Static analysis of C++ source code
Andrey Karpov
 
Static analysis of C++ source code
PVS-Studio
 
Grounded Pointers
Andrey Karpov
 
PVS-Studio delved into the FreeBSD kernel
PVS-Studio
 
Secure Programming Practices in C++ (NDC Security 2018)
Patricia Aas
 
A Unicorn Seeking Extraterrestrial Life: Analyzing SETI@home's Source Code
PVS-Studio
 
A scrupulous code review - 15 bugs in C++ code
PVS-Studio LLC
 
What has to be paid attention when reviewing code of the library you develop
Andrey Karpov
 
100 bugs in Open Source C/C++ projects
Andrey Karpov
 
Zero, one, two, Freddy's coming for you
Andrey Karpov
 
Ad

More from Andrey Karpov (20)

PDF
60 антипаттернов для С++ программиста
Andrey Karpov
 
PDF
60 terrible tips for a C++ developer
Andrey Karpov
 
PPTX
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Andrey Karpov
 
PDF
PVS-Studio in 2021 - Error Examples
Andrey Karpov
 
PDF
PVS-Studio in 2021 - Feature Overview
Andrey Karpov
 
PDF
PVS-Studio в 2021 - Примеры ошибок
Andrey Karpov
 
PDF
PVS-Studio в 2021
Andrey Karpov
 
PPTX
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Andrey Karpov
 
PPTX
Best Bugs from Games: Fellow Programmers' Mistakes
Andrey Karpov
 
PPTX
Does static analysis need machine learning?
Andrey Karpov
 
PPTX
Typical errors in code on the example of C++, C#, and Java
Andrey Karpov
 
PPTX
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
Andrey Karpov
 
PPTX
Game Engine Code Quality: Is Everything Really That Bad?
Andrey Karpov
 
PPTX
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
Andrey Karpov
 
PPTX
Static Code Analysis for Projects, Built on Unreal Engine
Andrey Karpov
 
PPTX
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Andrey Karpov
 
PPTX
The Great and Mighty C++
Andrey Karpov
 
PPTX
Static code analysis: what? how? why?
Andrey Karpov
 
PDF
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
Andrey Karpov
 
PDF
PVS-Studio Static Analyzer as a Tool for Protection against Zero-Day Vulnerab...
Andrey Karpov
 
60 антипаттернов для С++ программиста
Andrey Karpov
 
60 terrible tips for a C++ developer
Andrey Karpov
 
Ошибки, которые сложно заметить на code review, но которые находятся статичес...
Andrey Karpov
 
PVS-Studio in 2021 - Error Examples
Andrey Karpov
 
PVS-Studio in 2021 - Feature Overview
Andrey Karpov
 
PVS-Studio в 2021 - Примеры ошибок
Andrey Karpov
 
PVS-Studio в 2021
Andrey Karpov
 
Make Your and Other Programmer’s Life Easier with Static Analysis (Unreal Eng...
Andrey Karpov
 
Best Bugs from Games: Fellow Programmers' Mistakes
Andrey Karpov
 
Does static analysis need machine learning?
Andrey Karpov
 
Typical errors in code on the example of C++, C#, and Java
Andrey Karpov
 
How to Fix Hundreds of Bugs in Legacy Code and Not Die (Unreal Engine 4)
Andrey Karpov
 
Game Engine Code Quality: Is Everything Really That Bad?
Andrey Karpov
 
The Use of Static Code Analysis When Teaching or Developing Open-Source Software
Andrey Karpov
 
Static Code Analysis for Projects, Built on Unreal Engine
Andrey Karpov
 
Safety on the Max: How to Write Reliable C/C++ Code for Embedded Systems
Andrey Karpov
 
The Great and Mighty C++
Andrey Karpov
 
Static code analysis: what? how? why?
Andrey Karpov
 
PVS-Studio Is Now in Chocolatey: Checking Chocolatey under Azure DevOps
Andrey Karpov
 
PVS-Studio Static Analyzer as a Tool for Protection against Zero-Day Vulnerab...
Andrey Karpov
 
Ad

Recently uploaded (20)

PPTX
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
PDF
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
PDF
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
PPTX
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
PDF
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
PPTX
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
PDF
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
PDF
TheFutureIsDynamic-BoxLang witch Luis Majano.pdf
Ortus Solutions, Corp
 
PPTX
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
PDF
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
PDF
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
PDF
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
PDF
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
PPTX
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
PDF
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
PDF
MiniTool Partition Wizard 12.8 Crack License Key LATEST
hashhshs786
 
PDF
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
PPTX
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
PPTX
Comprehensive Risk Assessment Module for Smarter Risk Management
EHA Soft Solutions
 
PDF
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 
Home Care Tools: Benefits, features and more
Third Rock Techkno
 
Driver Easy Pro 6.1.1 Crack Licensce key 2025 FREE
utfefguu
 
Empower Your Tech Vision- Why Businesses Prefer to Hire Remote Developers fro...
logixshapers59
 
Agentic Automation: Build & Deploy Your First UiPath Agent
klpathrudu
 
iTop VPN With Crack Lifetime Activation Key-CODE
utfefguu
 
Milwaukee Marketo User Group - Summer Road Trip: Mapping and Personalizing Yo...
bbedford2
 
NEW-Viral>Wondershare Filmora 14.5.18.12900 Crack Free
sherryg1122g
 
TheFutureIsDynamic-BoxLang witch Luis Majano.pdf
Ortus Solutions, Corp
 
AEM User Group: India Chapter Kickoff Meeting
jennaf3
 
Generic or Specific? Making sensible software design decisions
Bert Jan Schrijver
 
Odoo CRM vs Zoho CRM: Honest Comparison 2025
Odiware Technologies Private Limited
 
MiniTool Power Data Recovery 8.8 With Crack New Latest 2025
bashirkhan333g
 
How to Hire AI Developers_ Step-by-Step Guide in 2025.pdf
DianApps Technologies
 
OpenChain @ OSS NA - In From the Cold: Open Source as Part of Mainstream Soft...
Shane Coughlan
 
SciPy 2025 - Packaging a Scientific Python Project
Henry Schreiner
 
MiniTool Partition Wizard 12.8 Crack License Key LATEST
hashhshs786
 
AI + DevOps = Smart Automation with devseccops.ai.pdf
Devseccops.ai
 
Agentic Automation Journey Session 1/5: Context Grounding and Autopilot for E...
klpathrudu
 
Comprehensive Risk Assessment Module for Smarter Risk Management
EHA Soft Solutions
 
4K Video Downloader Plus Pro Crack for MacOS New Download 2025
bashirkhan333g
 

Hypercritical C++ Code Review