From cd52a17a66844330a3fe9e7ed7469df2e3dba1e0 Mon Sep 17 00:00:00 2001 From: Matt Gardner Date: Tue, 27 Jun 2023 16:02:38 -0700 Subject: [PATCH 0001/1931] Update x64-software-conventions.md Add link to `__vectorcall` documentation --- docs/build/x64-software-conventions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/build/x64-software-conventions.md b/docs/build/x64-software-conventions.md index d1136eff59..959de8539f 100644 --- a/docs/build/x64-software-conventions.md +++ b/docs/build/x64-software-conventions.md @@ -18,6 +18,8 @@ Given the expanded register set, x64 uses the [__fastcall](../cpp/fastcall.md) c The **`__fastcall`** convention uses registers for the first four arguments, and the stack frame to pass more arguments. For details on the x64 calling convention, including register usage, stack parameters, return values, and stack unwinding, see [x64 calling convention](x64-calling-convention.md). +For more information on the `__vectorcall` calling convention, see [__vectorcall](../cpp/vectorcall.md). + ## Enable x64 compiler optimization The following compiler option helps you optimize your application for x64: From d2bef56cf398faaa1c5e653e22e5fd0a9d38218a Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Wed, 28 Jun 2023 10:37:32 -0400 Subject: [PATCH 0002/1931] Learn Editor: Update asan-debugger-integration.md --- docs/sanitizers/asan-debugger-integration.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/docs/sanitizers/asan-debugger-integration.md b/docs/sanitizers/asan-debugger-integration.md index f75d648ac4..fac6f39fc9 100644 --- a/docs/sanitizers/asan-debugger-integration.md +++ b/docs/sanitizers/asan-debugger-integration.md @@ -34,10 +34,18 @@ When you link the VCAsan library to your executable, users can enable it to gene `set ASAN_SAVE_DUMPS=MyFileName.dmp` -The file must have a .dmp suffix to follow the Visual Studio IDE conventions. +The file must have a `.dmp` extension to follow the Visual Studio IDE conventions. (Prior to 17.7) Here's what happens when a dump file is specified for `ASAN_SAVE_DUMPS`: If an error gets caught by the AddressSanitizer runtime, it saves a crash dump file that has the metadata associated with the error. The debugger in Visual Studio version 16.9 and later can parse the metadata that's saved in the dump file. You can set `ASAN_SAVE_DUMPS` on a per-test basis, store these binary artifacts, and then view them in the IDE with proper source indexing. +In Visual Studio version 17.7 and later, these capabilities were expanded to handle a variety of scenarios: + +1. Quotes will be stripped to accommodate spaces in directory or file names. In previous versions depending on the environment, setting the environment variable to have quotes or spaces would not work. + +1. If the `.dmp` extension is explicitly entered, VCAsan will try to use that explicitly and not add an associated process ID to the dump file name. + +1. If somehow a dmp already exists, VCAsan will attempt to write to a different file name similar to other Windows programs by appending a number in parentheses. If this does not work after several attempts, a temporary path will be used. If they all fail, an error message is displayed with diagnostic information. + ## See also [AddressSanitizer overview](./asan.md)\ @@ -47,3 +55,4 @@ Here's what happens when a dump file is specified for `ASAN_SAVE_DUMPS`: If an e [AddressSanitizer shadow bytes](./asan-shadow-bytes.md)\ [AddressSanitizer cloud or distributed testing](./asan-offline-crash-dumps.md)\ [AddressSanitizer error examples](./asan-error-examples.md) + From f2eb1674838b6919a13166d6aabe278147c70bf2 Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Wed, 28 Jun 2023 10:38:49 -0400 Subject: [PATCH 0003/1931] Learn Editor: Update asan-debugger-integration.md From d3b6e4947666c4384fe16f80b9568e6c0cfb6d41 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 5 Jul 2023 09:51:21 -0700 Subject: [PATCH 0004/1931] draft --- docs/sanitizers/asan-continue-on-error.md | 262 ++++++++++++++++++++++ docs/sanitizers/toc.yml | 2 + 2 files changed, 264 insertions(+) create mode 100644 docs/sanitizers/asan-continue-on-error.md diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md new file mode 100644 index 0000000000..c94ac9e4f7 --- /dev/null +++ b/docs/sanitizers/asan-continue-on-error.md @@ -0,0 +1,262 @@ +--- +title: "AddressSanitizer: continue on error" +description: "Top-level description of the AddressSanitizer feature for Microsoft C/C++." +ms.date: 06/13/2023 +f1_keywords: ["AddressSanitizer", "continue_on_error"] +helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "continue_on_error", "ASAN continue on error", "Address Sanitizer continue on error"] +--- + +# Address Sanitizer: continue_on_error + +[Memory safety errors](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, in C/C++ code are a [top concern](#_Top_Concern_%E2%80%93) for the industry. Visual Studio 17.6 introduces an experimental Address Sanitizer (ASAN) feature called continue_on_error (COE). You compile as before, and simply add the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you can enable continue_on_error by setting environment variables from the command line. + +When you create a standard C++ checked build of your app with `-fsanitizer=address.`, calls to allocators, deallocators, `memcpy`, `memset`, and so on are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but then monitors what happens with the memory to diagnose and report hidden memory safety errors--with zero false positives--as your app runs. + +Previously, ASAN would stop after it found the first memory safety error. One of the reasons for this is that the memory safety error it reported could have damaged the ASAN runtime itself. The ASAN runtime has been re-architected to guard against this outcome, and the new continue-on-error (COE) feature returns control to your app after each memory safety violation has been reported. This is particularly useful for running a large suite of test cases because they will continue running as they normally did, without short-circuiting your tests. Plus, you'll get a summary of the memory errors that occurred. + +If you are familiar with earlier versions of ASAN, you know that you needed the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. Which makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. + +## Introduction + +To stream unique memory safety errors to stdout(1) or stderr(2): + +- set ASAN_OPTIONS=continue_on_error=1 +- set ASAN_OPTIONS=continue_on_error=2 + +To stream to a log file of your choice: + +- set COE_LOG_FILE=your.file.log + +When you opt into the new continue on error (COE) feature, your application automatically diagnoses and reports unique memory safety errors as it runs. At program exit, the runtime produces a [final summary](#_Example) that follows the detailed reports normally produced by the Address Sanitizer. + +The compiler instruments your binaries to work with the address sanitizer runtime diagnose hidden memory safety errors. You can add the -fsanitize=address -Zi compiler flags and set the ASAN_OPTIONS or COE_LOG_FILE environment variable with values shown previously. You can then build and run your existing tests to exercise your code to find hidden memory-safety errors. + +This new COE functionality provides a "checked build" for C and C++ that finds hidden memory safety errors with zero false positives. + +# Hidden memory safety errors + +The following example creates a buffer overflow due to the loop exit test. When the example runs, it is *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop" which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. + +Errors are only observable if the following page is unmapped, or upon some subsequent use of corrupted data. All other cases are silent in the following example. + +```cpp +#include + +char* func(char* buf, size_tsz) +{ + char* local = (char*)malloc(sz); + for (auto ii = 0; ii **<=** sz; ii++) // bad loop exit test + { + local[ii] = ~buf[ii]; + } + return local; +} + +char original[10] = { 0,1,2,3,4,5,6,7,8,9 }; + +void main() +{ + char* inverted_buf= func(original,10); +} +``` + +In this example, where the parameter `sz` is 10 and the original buffer is 10-bytes, there are two memory safety errors: one is a load and the other is a store on the `for` loop. With continue_on_error, you will see both errors in the summary and the program will run to completion. The summary will look something like this: + +![](RackMultipart20230703-1-hvjsrt_html_b744b1efcbe3ccc2.png) JTW get picture + +_ **Figure 2** _ + +Note that continue_on_error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the .data section, and the other writes to memory allocated from the heap. + +# Description + +The default Address Sanitizer runtime behavior terminates your application after reporting the first error it encounters while running your program. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. + +The new COE functionality allows an application to **continue running while reporting** unique memory safety errors to a log file or to the command line. When enabled, COE tries to automatically return control back to the application after reporting each memory safety error, except for an access violation (AV) or failed memory allocation. With COE, you can compile and deploy an existing application into limited production to find memory safety issues while running for days (albeit slower). + +By adding compiler flags and setting an environment variable, you can immediately improve correctness and security. Your existing tests still pass but also uncover hidden memory safety errors. The compiler option (`-fsanitizer=address`) and runtime environment flag can be used to introduce a new "shipping gate." Subsequently, COE can then be used with all your existing tests. The developer gets a simple, well-defined, pass/fail for shipping any C or C++ app on Windows. + +Internally we have found that using this technology significantly reduces memory safety errors. If all your existing tests pass, _ **but** _ this new feature reports a memory safety error or a leak, don't ship your new code or integrate it into a parent branch. + +# **Example** + +```cpp +#include +#include + +struct Base +{ + //virtual ~Base() = default; +}; + +struct Derived : public Base +{ + std::wstring Value = L"Leaked if Base destructor is not virtual!"; +}; + +constexpr size_t PointDims = 3; +double pointsInGlobalData[PointDims] = { 1.0, 2.0, 3.0 }; + +int main() +{ + pointsInGlobalData[3] = 3.0; + for (int i = 0; i < 2; i++) + { + double pointOnStack[PointDims] = { 1.0, 2.0, 3.0 }; + pointOnStack[-1] = 3.0; + pointOnStack[PointDims] = 0.0; + + double* pointOnHeap = new double[PointDims + 100000]; + pointOnHeap[-1] = 4.0; + delete[] pointOnHeap; + + double* pointDoubleFree = new double[PointDims] { 1.0, 2.0, 3.0 }; + pointDoubleFree[PointDims] = 4.0; + delete[] pointDoubleFree; + Base* base = new Derived(); + delete base; // missing virtual destrucor + constexpr size_t buff_size = 128; + char* buffer = new char[buff_size]; + std::memset(buffer, '\0', buff_size); + std::memset(&buffer[buff_size - 28], '=', 30); + } + wprintf_s(L"Loop completed!\r\n"); +} + +_ **Figure 3** _ + +With continue_on_error, the program in Figure 3 above, produces the summary in Figure 4. That summary is printed _ **after** _ streaming all unique detailed error reports which are produced using the existing default mode of the Address Sanitizer. The existing default mode is "one-n-done". The previous Address Sanitizer only prints one detailed error report, and then exits your process. With continue_on_error, we continue to execute after various memory safety errors. This summary illustrates continuing after many memory safety errors: + +![](RackMultipart20230703-1-hvjsrt_html_d751003cd5ba2429.png) + +_ **Figure 4** _ + +Beneath the first red box at the top of Figure 4, there are three files sorted by error. This is followed by the file, function, and line displayed beneath the second box. The third box calls out eight unique errors--where unique is defined in terms of a hash function which uses call stacks and error descriptions. Use of the term [unique](#_Unique) is discussed in the next section. + +The detailed error reports (omitted in the screen capture in Figure 4) are printed before this summary and contain shadow bytes with all the details for each error in the summary. + +# Unique + +The uniqueness of an error (to limit streaming duplicates) is determined by an internal **hash function** that uses the type of error and the call stack(s) at the time of error. A detailed individual error report includes stack trace(s). Here are the two detailed errors in the "secure by coincidence" example in Figure 1. The call stacks and types of errors are used to internally create an internal C++ error object, which is then hashed to a unique integer. The global-buffer-overflow in Figure 5 only has one call stack and is a different type of error object from the heap-buffer-overflow in Figure 6, which has two call stacks. + +![](RackMultipart20230703-1-hvjsrt_html_f8328130dd6458f.png) + +_ **Figure 5** _ + +![](RackMultipart20230703-1-hvjsrt_html_814ba706fac2d9d1.png) + +_ **Figure 6** _ + +The runtime will hash each occurrence of an error at runtime in order to prevent duplication. Consider a [memory-safety](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) error that's executed 10000 times in a loop. The detailed error will be reported once, but its "hit count" of 1000 will be reported in the summary. + +# Not continuing. + +Two examples where the continue on error feature _ **cannot continue** _ are: + +- Malloc is given an undefined argument, such as a negative number. +- There's an AV while trying to read or write to memory that hasn't been allocated, or to which it doesn't have access. + +Consider the following program which has an AV because it tries to read from location 0x13: + +```cpp +#include + +void main() +{ + unsigned int* local_ptr = (unsigned int*) 0x13; + printf("use of undefined address %p [%x]\n", local_ptr, *local_ptr); +} +``` + +_ **Figure 7** _ + +On Windows 11, when the example in Figure 7 above, is compiled with -fsanitize=address -Zi, you'll see the following error message in Figure 8, below. + +![](RackMultipart20230703-1-hvjsrt_html_d1427cf52a5c06fe.png) + +_ **Figure 8** _ + +We choose to "gracefully cancel" the attempt to continue from AV's that are **not** caught with a user's structured exception handling. + +# Matching undefined behavior + +We haven't been able to do a complete audit that would allow us to "match" undefined behaviors for C and C++. The following example in Figure 9, makes this tangible. At the commentedline in the following code example, code generation from the compiler and the runtime implementation are both different for **_alloca** when compiling with -fsanitize=address -Zi: + +```cpp +#include +#include +#include +#include +#include + +#define RET_FINISH 0 +#define RET_STACK_EXCEPTION 1 +#define RET_OTHER_EXCEPTION 2 + +int foo_redundant(unsigned long arg_var) +{ + char *a; + int ret = -1; + + __try + { + if ((arg_var+3) > arg_var) + { + // Call to alloca using parameter from main + a = (char *) _alloca(arg_var); + memset(a, 0, 10); + } + + ret = RET_FINISH; + } + __except(1) + { + ret = RET_OTHER_EXCEPTION; + int i = GetExceptionCode(); + if (i == EXCEPTION_STACK_OVERFLOW) + { + ret = RET_STACK_EXCEPTION; + } + } + + return ret; +} + +void main() +{ + int cnt = 0; + + if (foo_redundant(0xfffffff0) == RET_STACK_EXCEPTION) + { + cnt++; + } + + if (cnt == 1) + { + printf("pass\n"); + ] + else + { + printf("fail\n"); + } +} +_ **Figure 9** _ + +The previous example, in Figure 9, prints **pass** without -fsanitize=address. That's because **cnt==1** due to an exception. It will fail when compiled with that flag and run with the Address Sanitizer runtime. In main() we pass a large number to foo_redundant, which is passed to _alloca(). + +With the Address Sanitizer in continue_on_error (COE) mode, this program runs to completion, but prints **fail**. The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow (i.e., wrap around) creating a reasonable, small positive number as the parameter to _alloca. + +**There will be no stack overflow exception to process the __except handler.`** + +We have not had time to document or clearly define the subtle differences when a program has undefined behavior. This was a reason for releasing continue_on_error as experimental at first. + +**NOTE: The frequency with which this concern has become visible, has been rare with our testing infrastructure.** + +# Top Concern – don't ship without it. + +There were six categories of C++ [memory safety](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) errors in the 2021 Common Weakness Enumeration (CWE) [Top 25 Most Dangerous Software Weaknesses](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcwe.mitre.org%2Ftop25%2Farchive%2F2021%2F2021_cwe_top25.html&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=ZWphesh6v9f2PKasnd2qxKrq26EebWpv8Tb6JK1RFXg%3D&reserved=0). The best [Remote Code Execution Bug](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpwnies.com%2Fwinners%2F&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=%2BbYI%2FqxTAHAPZzkmdmnFgpaQ%2Bb4%2B1a953XrBDUVZ9OI%3D&reserved=0) was a 20 year old heap-buffer-overflow. This award in 2022 went to BugHunter010 at Cyber KunLun Lab. This engineer discovered a heap-buffer-overflow vulnerability in the RPC protocol with CVSS score 9.8. This bug has existed in the Windows system for more than 20 years. There are new C++ memory safety bugs introduced daily because traditional testing can't expose these types of bugs without compiler and runtime support. + +This new feature is designed to enable developers to implement a simple new gate for shipping C++ on Windows. Using this technology will significantly reduce memory safety errors. If your tests pass but continue_on_error reports any hidden memory safety errors, you should not ship or integrate new code into the development branch. + +**We intend that continue_on_error be used as pass/fail gate, for all CI/CD pipelines using C and C++.** + diff --git a/docs/sanitizers/toc.yml b/docs/sanitizers/toc.yml index 9bd6b4ffcd..a40e180696 100644 --- a/docs/sanitizers/toc.yml +++ b/docs/sanitizers/toc.yml @@ -6,6 +6,8 @@ items: items: - name: "AddressSanitizer overview" href: ../sanitizers/asan.md + - name: Continue on error feature + href: ../sanitizers/asan-continue-on-error.md - name: "Build and language reference" href: ../sanitizers/asan-building.md - name: "Runtime reference" From 8a080c306d1191f6be00f6870cbdb1c18e87c19e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 11 Jul 2023 15:49:25 -0700 Subject: [PATCH 0005/1931] draft --- docs/c-runtime-library/toc.yml | 2 +- docs/sanitizers/asan-continue-on-error.md | 93 ++++++++++++++++++++--- 2 files changed, 85 insertions(+), 10 deletions(-) diff --git a/docs/c-runtime-library/toc.yml b/docs/c-runtime-library/toc.yml index b4497d6277..65db82f1b6 100644 --- a/docs/c-runtime-library/toc.yml +++ b/docs/c-runtime-library/toc.yml @@ -326,7 +326,7 @@ items: href: ../c-runtime-library/fseek-lseek-constants.md - name: Heap constants href: ../c-runtime-library/heap-constants.md - - name: _HEAP_MAXREQ + - name: `_HEAP_MAXREQ` href: ../c-runtime-library/heap-maxreq.md - name: HUGE_VAL, _HUGE href: ../c-runtime-library/huge-val-huge.md diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index c94ac9e4f7..284e2fb753 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,22 +1,73 @@ --- -title: "AddressSanitizer: continue on error" -description: "Top-level description of the AddressSanitizer feature for Microsoft C/C++." -ms.date: 06/13/2023 +title: "Walkthrough: Use Address Sanitizer continue_on_error to find memory safety issues" +description: "Learn how to use Address Sanitizer continue on error to to find memory safety errors in your app." +ms.date: 07/10/2023 f1_keywords: ["AddressSanitizer", "continue_on_error"] helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "continue_on_error", "ASAN continue on error", "Address Sanitizer continue on error"] --- -# Address Sanitizer: continue_on_error +# Walkthrough: Use Address Sanitizer continue_on_error to find memory safety issues -[Memory safety errors](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, in C/C++ code are a [top concern](#_Top_Concern_%E2%80%93) for the industry. Visual Studio 17.6 introduces an experimental Address Sanitizer (ASAN) feature called continue_on_error (COE). You compile as before, and simply add the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you can enable continue_on_error by setting environment variables from the command line. +Memory safety errors--such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on--are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes many hard-to-find bugs of this kind with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) -When you create a standard C++ checked build of your app with `-fsanitizer=address.`, calls to allocators, deallocators, `memcpy`, `memset`, and so on are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but then monitors what happens with the memory to diagnose and report hidden memory safety errors--with zero false positives--as your app runs. +Continue_on_error (COE) is a new ASAN feature that allows you to create a checked build for your C and C++ programs that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or a log file of your choice. -Previously, ASAN would stop after it found the first memory safety error. One of the reasons for this is that the memory safety error it reported could have damaged the ASAN runtime itself. The ASAN runtime has been re-architected to guard against this outcome, and the new continue-on-error (COE) feature returns control to your app after each memory safety violation has been reported. This is particularly useful for running a large suite of test cases because they will continue running as they normally did, without short-circuiting your tests. Plus, you'll get a summary of the memory errors that occurred. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when a memory error is encountered. Instead, it continues to run and provides a summary of all the memory issues that were found after it exits. This allows you to run an ASAN checked build of your app in your normal test harness to exercise its code paths. Then, you'll get a summary of the memory issues encountered afterwards. You should consider using this feature to create a new shipping gate by deciding not to ship any code that encounters memory safety errors during a test pass. -If you are familiar with earlier versions of ASAN, you know that you needed the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. Which makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. +This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code that has memory safety errors. + +## Prerequisites + +To complete this walkthrough, you must have installed either Visual Studio 2022 17.6 or later and the optional Desktop development with C++ workload, or the command-line Build Tools for Visual Studio. + +## Out of bounds memory access example + +When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but then monitors what happens with the memory to diagnose and report hidden memory safety errors--with zero false positives--as your app runs. -## Introduction +In this example, you'll create a checked build and set an environment variable to output the address sanitizer information to stdout. + +### Build a checked build with ASAN enabled + +1. Open a developer command prompt. For example, open the Start menu, type *Developer*, and select **Developer Command Prompt for VS 2022** from the list of matches. +1. Create a directory on your machine to run this example in. For example, `%USERPROFILE%\Desktop\COE`. +1. In that directory, create a source file, for example, `coe.cpp`, and use the following code as its contents: + +```cpp +#include + +char* func(char* buf, size_t sz) +{ + char* local = (char*)malloc(sz); + for (auto ii = 0; ii <= sz; ii++) // bad loop exit test + { + local[ii] = ~buf[ii]; // Two memory safety errors + } + + return local; +} + +char buffer[10] = {0,1,2,3,4,5,6,7,8,9}; + +void main() +{ + char* inverted_buf= func(buffer, 10); +} +``` + +1. Compile the code using the `-fsanitize=address` and `-Zi` switches: `cl -fsanitize=address -Zi coe.cpp` +1. Set the ASAN_OPTIONS environment variable to output to stdout: `set ASAN_OPTIONS=continue_on_error=1` +1. Run the test code: `coe.exe` + +The output indicates the buffer overflow and a call stack for where it happened. There is information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [shadowbytes](). +Then there is a summary of + +There are different options for where the output from ASAN can go. They are: + +- Output to stdout: `set ASAN_OPTIONS=continue_on_error=1` +- Output to stderr: `set ASAN_OPTIONS=continue_on_error=2` +- Output to a log file of your choice: `set COE_LOG_FILE=yourfile.log` + +### Set an environment variable to output to stdout To stream unique memory safety errors to stdout(1) or stderr(2): @@ -27,6 +78,9 @@ To stream to a log file of your choice: - set COE_LOG_FILE=your.file.log + +### Run the test and examine the output + When you opt into the new continue on error (COE) feature, your application automatically diagnoses and reports unique memory safety errors as it runs. At program exit, the runtime produces a [final summary](#_Example) that follows the detailed reports normally produced by the Address Sanitizer. The compiler instruments your binaries to work with the address sanitizer runtime diagnose hidden memory safety errors. You can add the -fsanitize=address -Zi compiler flags and set the ASAN_OPTIONS or COE_LOG_FILE environment variable with values shown previously. You can then build and run your existing tests to exercise your code to find hidden memory-safety errors. @@ -260,3 +314,24 @@ This new feature is designed to enable developers to implement a simple new gate **We intend that continue_on_error be used as pass/fail gate, for all CI/CD pipelines using C and C++.** +## See also + +[top concern](#_Top_Concern_%E2%80%93) +[Memory safety errors](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) + + +SPARE PARTS + +Visual Studio 17.6 introduced an experimental Address Sanitizer (ASAN) feature called continue_on_error (COE). You compile as before but with the the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you enable continue_on_error by setting environment variables from the command line. + +If you are familiar with earlier versions of ASAN, you know that you needed the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. Which makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. + +In the Visual Studio development environment, set the compiler switch [/fsanitizer=address](../build/reference/fsanitize.md): + +1. Open your project's **Property Pages** dialog box. +1. Select the **Configuration Properties** > **C/C++** > **General** property page. +1. Modify the **Enable Address Sanitizer** property. To enable it, choose Yes (/fsanitize=address). +1. Choose OK to save your changes. + +Build the app from the main menu with **Build** > **Build Solution**. + From fa7aa7f3b046b39f9aa041412788c5344a32f03c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 11 Jul 2023 17:36:08 -0700 Subject: [PATCH 0006/1931] draft --- docs/sanitizers/asan-continue-on-error.md | 87 ++++++++++++++++------- 1 file changed, 63 insertions(+), 24 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 284e2fb753..9425ec2553 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,20 +1,20 @@ --- -title: "Walkthrough: Use Address Sanitizer continue_on_error to find memory safety issues" +title: "Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues" description: "Learn how to use Address Sanitizer continue on error to to find memory safety errors in your app." ms.date: 07/10/2023 -f1_keywords: ["AddressSanitizer", "continue_on_error"] -helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "continue_on_error", "ASAN continue on error", "Address Sanitizer continue on error"] +f1_keywords: ["AddressSanitizer", "Continue On Error"] +helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "Continue On Error", "ASAN continue on error", "Address Sanitizer continue on error"] --- -# Walkthrough: Use Address Sanitizer continue_on_error to find memory safety issues +# Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues Memory safety errors--such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on--are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes many hard-to-find bugs of this kind with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) -Continue_on_error (COE) is a new ASAN feature that allows you to create a checked build for your C and C++ programs that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or a log file of your choice. +Continue On Error (COE) is a new ASAN feature that allows you to create a checked build for your C and C++ programs that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or the log file of your choice. -A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when a memory error is encountered. Instead, it continues to run and provides a summary of all the memory issues that were found after it exits. This allows you to run an ASAN checked build of your app in your normal test harness to exercise its code paths. Then, you'll get a summary of the memory issues encountered afterwards. You should consider using this feature to create a new shipping gate by deciding not to ship any code that encounters memory safety errors during a test pass. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running and report the error when the first memory error is encountered. Instead, it notes the error and continues to run. When your app exits, a summary is provided of all the memory issues that were encountered as it ran. This means you can run an ASAN checked build of your app in your normal test harness to exercise its code paths without interfering with the tests. Afterwards you can examine the summary of memory issues encountered. You can consider using this feature as a way to create a new shipping gate by deciding not to ship any code that encounters memory safety errors during your test passes. -This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code that has memory safety errors. +This walkthrough shows how to create a checked build that has COE enabled and what the output looks like for code that has memory safety errors. ## Prerequisites @@ -28,9 +28,9 @@ In this example, you'll create a checked build and set an environment variable t ### Build a checked build with ASAN enabled -1. Open a developer command prompt. For example, open the Start menu, type *Developer*, and select **Developer Command Prompt for VS 2022** from the list of matches. +1. Open a developer command prompt: for example, open the **Start** menu, type *Developer*, and select **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example in. For example, `%USERPROFILE%\Desktop\COE`. -1. In that directory, create a source file, for example, `coe.cpp`, and use the following code as its contents: +1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: ```cpp #include @@ -55,24 +55,63 @@ void main() ``` 1. Compile the code using the `-fsanitize=address` and `-Zi` switches: `cl -fsanitize=address -Zi coe.cpp` -1. Set the ASAN_OPTIONS environment variable to output to stdout: `set ASAN_OPTIONS=continue_on_error=1` +1. Set the `ASAN_OPTIONS` environment variable to have ASAN output to stdout: `set ASAN_OPTIONS=Continue On Error=1` 1. Run the test code: `coe.exe` -The output indicates the buffer overflow and a call stack for where it happened. There is information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [shadowbytes](). -Then there is a summary of +The output indicates that there were two memory buffer overflow errors and a call stack for where they happened, for example: + +```dos +==9776==ERROR: AddressSanitizer: global-buffer-overflow on address 0x0047b08a at pc 0x003c121b bp 0x012ffaec sp 0x012ffae0 +READ of size 1 at 0x0047b08a thread T0 + #0 func C:\Users\xxx\Desktop\COE\coe.cpp(8) + #1 main C:\Users\xxx\Desktop\COE\coe.cpp(18) + #2 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #3 BaseThreadInitThunk Windows + #4 RtlInitializeExceptionChain Windows +``` + +Then there is information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [shadowbytes](). + +Then there is the summary report of source files where the memory errors happened. It is sorted in order of the unique call stacks there are for memory errors in that file. The reason for this sorting is that 5 unique call stacks leading to different memory safety errors in the same file is potentially even more worrisome than one error that hits many times. It looks like this: + +```dos +=== Files in priority order === + +File: C:\Users\xxx\Desktop\COE\coe.cpp Unique call stacks: 2 +``` + +Finally, the report contains a summary of where the memory errors occurred. It'll look something like this: + +```dos +=== Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === + +File: C:\Users\xxx\Desktop\COE\coe.cpp + Func: func() + Line: 8 Unique call stacks (paths) leading to error at line 8 : 2 + Bug: heap-buffer-overflow at instr 124 bytes from start of line + +>>>Total: 2 Unique Memory Safety Issues (based on call stacks not source position) <<< + +#0 C:\Users\xxx\Desktop\COE\coe.cpp Function: func(Line:8) + Raw HitCnt: 1 On Reference: 1-byte-read-global-buffer-overflow +#1 C:\Users\xxx\Desktop\COE\coe.cpp Function: func(Line:8) + Raw HitCnt: 1 On Reference: 1-byte-write-heap-buffer-overflow +``` + +Finally, there is a There are different options for where the output from ASAN can go. They are: -- Output to stdout: `set ASAN_OPTIONS=continue_on_error=1` -- Output to stderr: `set ASAN_OPTIONS=continue_on_error=2` +- Output to stdout: `set ASAN_OPTIONS=Continue On Error=1` +- Output to stderr: `set ASAN_OPTIONS=Continue On Error=2` - Output to a log file of your choice: `set COE_LOG_FILE=yourfile.log` ### Set an environment variable to output to stdout To stream unique memory safety errors to stdout(1) or stderr(2): -- set ASAN_OPTIONS=continue_on_error=1 -- set ASAN_OPTIONS=continue_on_error=2 +- set ASAN_OPTIONS=Continue On Error=1 +- set ASAN_OPTIONS=Continue On Error=2 To stream to a log file of your choice: @@ -114,13 +153,13 @@ void main() } ``` -In this example, where the parameter `sz` is 10 and the original buffer is 10-bytes, there are two memory safety errors: one is a load and the other is a store on the `for` loop. With continue_on_error, you will see both errors in the summary and the program will run to completion. The summary will look something like this: +In this example, where the parameter `sz` is 10 and the original buffer is 10-bytes, there are two memory safety errors: one is a load and the other is a store on the `for` loop. With Continue On Error, you will see both errors in the summary and the program will run to completion. The summary will look something like this: ![](RackMultipart20230703-1-hvjsrt_html_b744b1efcbe3ccc2.png) JTW get picture _ **Figure 2** _ -Note that continue_on_error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the .data section, and the other writes to memory allocated from the heap. +Note that Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the .data section, and the other writes to memory allocated from the heap. # Description @@ -179,7 +218,7 @@ int main() _ **Figure 3** _ -With continue_on_error, the program in Figure 3 above, produces the summary in Figure 4. That summary is printed _ **after** _ streaming all unique detailed error reports which are produced using the existing default mode of the Address Sanitizer. The existing default mode is "one-n-done". The previous Address Sanitizer only prints one detailed error report, and then exits your process. With continue_on_error, we continue to execute after various memory safety errors. This summary illustrates continuing after many memory safety errors: +With Continue On Error, the program in Figure 3 above, produces the summary in Figure 4. That summary is printed _ **after** _ streaming all unique detailed error reports which are produced using the existing default mode of the Address Sanitizer. The existing default mode is "one-n-done". The previous Address Sanitizer only prints one detailed error report, and then exits your process. With Continue On Error, we continue to execute after various memory safety errors. This summary illustrates continuing after many memory safety errors: ![](RackMultipart20230703-1-hvjsrt_html_d751003cd5ba2429.png) @@ -298,11 +337,11 @@ _ **Figure 9** _ The previous example, in Figure 9, prints **pass** without -fsanitize=address. That's because **cnt==1** due to an exception. It will fail when compiled with that flag and run with the Address Sanitizer runtime. In main() we pass a large number to foo_redundant, which is passed to _alloca(). -With the Address Sanitizer in continue_on_error (COE) mode, this program runs to completion, but prints **fail**. The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow (i.e., wrap around) creating a reasonable, small positive number as the parameter to _alloca. +With the Address Sanitizer in Continue On Error (COE) mode, this program runs to completion, but prints **fail**. The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow (i.e., wrap around) creating a reasonable, small positive number as the parameter to _alloca. **There will be no stack overflow exception to process the __except handler.`** -We have not had time to document or clearly define the subtle differences when a program has undefined behavior. This was a reason for releasing continue_on_error as experimental at first. +We have not had time to document or clearly define the subtle differences when a program has undefined behavior. This was a reason for releasing Continue On Error as experimental at first. **NOTE: The frequency with which this concern has become visible, has been rare with our testing infrastructure.** @@ -310,9 +349,9 @@ We have not had time to document or clearly define the subtle differences when a There were six categories of C++ [memory safety](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) errors in the 2021 Common Weakness Enumeration (CWE) [Top 25 Most Dangerous Software Weaknesses](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcwe.mitre.org%2Ftop25%2Farchive%2F2021%2F2021_cwe_top25.html&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=ZWphesh6v9f2PKasnd2qxKrq26EebWpv8Tb6JK1RFXg%3D&reserved=0). The best [Remote Code Execution Bug](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpwnies.com%2Fwinners%2F&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=%2BbYI%2FqxTAHAPZzkmdmnFgpaQ%2Bb4%2B1a953XrBDUVZ9OI%3D&reserved=0) was a 20 year old heap-buffer-overflow. This award in 2022 went to BugHunter010 at Cyber KunLun Lab. This engineer discovered a heap-buffer-overflow vulnerability in the RPC protocol with CVSS score 9.8. This bug has existed in the Windows system for more than 20 years. There are new C++ memory safety bugs introduced daily because traditional testing can't expose these types of bugs without compiler and runtime support. -This new feature is designed to enable developers to implement a simple new gate for shipping C++ on Windows. Using this technology will significantly reduce memory safety errors. If your tests pass but continue_on_error reports any hidden memory safety errors, you should not ship or integrate new code into the development branch. +This new feature is designed to enable developers to implement a simple new gate for shipping C++ on Windows. Using this technology will significantly reduce memory safety errors. If your tests pass but Continue On Error reports any hidden memory safety errors, you should not ship or integrate new code into the development branch. -**We intend that continue_on_error be used as pass/fail gate, for all CI/CD pipelines using C and C++.** +**We intend that Continue On Error be used as pass/fail gate, for all CI/CD pipelines using C and C++.** ## See also @@ -322,7 +361,7 @@ This new feature is designed to enable developers to implement a simple new gate SPARE PARTS -Visual Studio 17.6 introduced an experimental Address Sanitizer (ASAN) feature called continue_on_error (COE). You compile as before but with the the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you enable continue_on_error by setting environment variables from the command line. +Visual Studio 17.6 introduced an experimental Address Sanitizer (ASAN) feature called Continue On Error (COE). You compile as before but with the the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you enable Continue On Error by setting environment variables from the command line. If you are familiar with earlier versions of ASAN, you know that you needed the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. Which makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. From d2c967fcf70ba4847930cd7f6986ed5be79dee70 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 12 Jul 2023 16:12:54 -0700 Subject: [PATCH 0007/1931] draft --- docs/c-runtime-library/toc.yml | 2 +- docs/sanitizers/asan-continue-on-error.md | 283 +++++----------------- 2 files changed, 58 insertions(+), 227 deletions(-) diff --git a/docs/c-runtime-library/toc.yml b/docs/c-runtime-library/toc.yml index 65db82f1b6..b4497d6277 100644 --- a/docs/c-runtime-library/toc.yml +++ b/docs/c-runtime-library/toc.yml @@ -326,7 +326,7 @@ items: href: ../c-runtime-library/fseek-lseek-constants.md - name: Heap constants href: ../c-runtime-library/heap-constants.md - - name: `_HEAP_MAXREQ` + - name: _HEAP_MAXREQ href: ../c-runtime-library/heap-maxreq.md - name: HUGE_VAL, _HUGE href: ../c-runtime-library/huge-val-huge.md diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 9425ec2553..02433036db 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,35 +1,41 @@ --- title: "Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues" -description: "Learn how to use Address Sanitizer continue on error to to find memory safety errors in your app." -ms.date: 07/10/2023 +description: "Learn how to use Address Sanitizer continue on error to find memory safety errors in your app." +ms.date: 07/13/2023 f1_keywords: ["AddressSanitizer", "Continue On Error"] helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "Continue On Error", "ASAN continue on error", "Address Sanitizer continue on error"] --- # Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues -Memory safety errors--such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on--are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes many hard-to-find bugs of this kind with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) +Memory safety errors--such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on--are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) -Continue On Error (COE) is a new ASAN feature that allows you to create a checked build for your C and C++ programs that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or the log file of your choice. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or the log file of your choice. -A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running and report the error when the first memory error is encountered. Instead, it notes the error and continues to run. When your app exits, a summary is provided of all the memory issues that were encountered as it ran. This means you can run an ASAN checked build of your app in your normal test harness to exercise its code paths without interfering with the tests. Afterwards you can examine the summary of memory issues encountered. You can consider using this feature as a way to create a new shipping gate by deciding not to ship any code that encounters memory safety errors during your test passes. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, it notes the error and continues to run. When your app exits, a summary of all the memory issues that were encountered is provided. -This walkthrough shows how to create a checked build that has COE enabled and what the output looks like for code that has memory safety errors. +You can create a checked build for your C and C++ programs with ASAN turned on that you run in your test harness. As your tests exercise the code paths in your app for bugs, you'll also find out if those code paths also harbor memory safety issues. And without interfering with the tests. + +Afterwards, you get a summary of the memory issues encountered. With COE, you can compile and deploy an existing application into limited production to find memory safety issues while running for days (albeit the app will run slower). + +You can use this feature to create a new shipping gate: if all your existing tests pass but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. + +This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code that has memory safety errors. ## Prerequisites -To complete this walkthrough, you must have installed either Visual Studio 2022 17.6 or later and the optional Desktop development with C++ workload, or the command-line Build Tools for Visual Studio. +To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the Desktop development with C++ workload installed. ## Out of bounds memory access example -When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but then monitors what happens with the memory to diagnose and report hidden memory safety errors--with zero false positives--as your app runs. +When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors--with zero false positives--as your app runs. -In this example, you'll create a checked build and set an environment variable to output the address sanitizer information to stdout. +In this example, create a checked build and set an environment variable to output the address sanitizer information to `stdout`. -### Build a checked build with ASAN enabled +### Create a checked build with ASAN enabled -1. Open a developer command prompt: for example, open the **Start** menu, type *Developer*, and select **Developer Command Prompt for VS 2022** from the list of matches. -1. Create a directory on your machine to run this example in. For example, `%USERPROFILE%\Desktop\COE`. +1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt, such as **Developer Command Prompt for VS 2022**, from the list of matches. +1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: ```cpp @@ -54,13 +60,26 @@ void main() } ``` -1. Compile the code using the `-fsanitize=address` and `-Zi` switches: `cl -fsanitize=address -Zi coe.cpp` -1. Set the `ASAN_OPTIONS` environment variable to have ASAN output to stdout: `set ASAN_OPTIONS=Continue On Error=1` +In the preceding code, the parameter `sz` is 10 and the original buffer is 10 bytes. There are two memory safety errors that we will see if COE finds: + +- an out-of-bounds load from `buf` in the `for` loop +- an out-of-bounds store to `local` in the `for` loop + +The buffer buffer overflow is due to the loop exit test `<=sz`. When the example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop" which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. + +Errors are only observable if the following page is unmapped, or upon use of corrupted data. All other cases are silent in the following example. With Continue On Error, you see both errors in the summary and the program will run to completion. + +Create a checked build of the preceding code with COE turned on: + +1. Compile the code using the `-fsanitize=address` (turn on COE) and `-Zi` (create a separate PDB file) switches: `cl -fsanitize=address -Zi coe.cpp` +1. Set the `ASAN_OPTIONS` environment variable to send ASAN output to stdout: `set ASAN_OPTIONS=Continue On Error=1` 1. Run the test code: `coe.exe` -The output indicates that there were two memory buffer overflow errors and a call stack for where they happened, for example: +The output shows that there were two memory buffer overflow errors, as expected, and gives the call stack for where they happened. + +COE reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. The report looks like this: -```dos +```cmd ==9776==ERROR: AddressSanitizer: global-buffer-overflow on address 0x0047b08a at pc 0x003c121b bp 0x012ffaec sp 0x012ffae0 READ of size 1 at 0x0047b08a thread T0 #0 func C:\Users\xxx\Desktop\COE\coe.cpp(8) @@ -70,19 +89,21 @@ READ of size 1 at 0x0047b08a thread T0 #4 RtlInitializeExceptionChain Windows ``` -Then there is information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [shadowbytes](). +Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). -Then there is the summary report of source files where the memory errors happened. It is sorted in order of the unique call stacks there are for memory errors in that file. The reason for this sorting is that 5 unique call stacks leading to different memory safety errors in the same file is potentially even more worrisome than one error that hits many times. It looks like this: +Then there's a summary of the source files where the memory errors happened. It's sorted in order of the unique call stacks for the memory errors in that file. What determines a unique call stack is the type of error and the call stack where the error occurred. -```dos +The reason for this sorting is that five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: + +```cmd === Files in priority order === File: C:\Users\xxx\Desktop\COE\coe.cpp Unique call stacks: 2 ``` -Finally, the report contains a summary of where the memory errors occurred. It'll look something like this: +Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap.It looks like this: -```dos +```cmd === Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === File: C:\Users\xxx\Desktop\COE\coe.cpp @@ -98,182 +119,19 @@ File: C:\Users\xxx\Desktop\COE\coe.cpp Raw HitCnt: 1 On Reference: 1-byte-write-heap-buffer-overflow ``` -Finally, there is a +The default Address Sanitizer runtime behavior terminates your application after reporting the first error encountered while running your program. It does not allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. COE tries to automatically return control back to the application after reporting each memory safety error. There are times when it can't, such as when there is a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that aren't caught by the program's structured exception handling. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. -There are different options for where the output from ASAN can go. They are: +### Set an environment variable to output to stdout + +There are different options for where the output from ASAN goes. They are: - Output to stdout: `set ASAN_OPTIONS=Continue On Error=1` - Output to stderr: `set ASAN_OPTIONS=Continue On Error=2` - Output to a log file of your choice: `set COE_LOG_FILE=yourfile.log` - -### Set an environment variable to output to stdout - -To stream unique memory safety errors to stdout(1) or stderr(2): - -- set ASAN_OPTIONS=Continue On Error=1 -- set ASAN_OPTIONS=Continue On Error=2 - -To stream to a log file of your choice: - -- set COE_LOG_FILE=your.file.log - - -### Run the test and examine the output - -When you opt into the new continue on error (COE) feature, your application automatically diagnoses and reports unique memory safety errors as it runs. At program exit, the runtime produces a [final summary](#_Example) that follows the detailed reports normally produced by the Address Sanitizer. - -The compiler instruments your binaries to work with the address sanitizer runtime diagnose hidden memory safety errors. You can add the -fsanitize=address -Zi compiler flags and set the ASAN_OPTIONS or COE_LOG_FILE environment variable with values shown previously. You can then build and run your existing tests to exercise your code to find hidden memory-safety errors. - -This new COE functionality provides a "checked build" for C and C++ that finds hidden memory safety errors with zero false positives. - -# Hidden memory safety errors - -The following example creates a buffer overflow due to the loop exit test. When the example runs, it is *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop" which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. - -Errors are only observable if the following page is unmapped, or upon some subsequent use of corrupted data. All other cases are silent in the following example. - -```cpp -#include - -char* func(char* buf, size_tsz) -{ - char* local = (char*)malloc(sz); - for (auto ii = 0; ii **<=** sz; ii++) // bad loop exit test - { - local[ii] = ~buf[ii]; - } - return local; -} - -char original[10] = { 0,1,2,3,4,5,6,7,8,9 }; - -void main() -{ - char* inverted_buf= func(original,10); -} -``` - -In this example, where the parameter `sz` is 10 and the original buffer is 10-bytes, there are two memory safety errors: one is a load and the other is a store on the `for` loop. With Continue On Error, you will see both errors in the summary and the program will run to completion. The summary will look something like this: - -![](RackMultipart20230703-1-hvjsrt_html_b744b1efcbe3ccc2.png) JTW get picture -_ **Figure 2** _ +## Handling undefined behavior -Note that Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the .data section, and the other writes to memory allocated from the heap. - -# Description - -The default Address Sanitizer runtime behavior terminates your application after reporting the first error it encounters while running your program. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. - -The new COE functionality allows an application to **continue running while reporting** unique memory safety errors to a log file or to the command line. When enabled, COE tries to automatically return control back to the application after reporting each memory safety error, except for an access violation (AV) or failed memory allocation. With COE, you can compile and deploy an existing application into limited production to find memory safety issues while running for days (albeit slower). - -By adding compiler flags and setting an environment variable, you can immediately improve correctness and security. Your existing tests still pass but also uncover hidden memory safety errors. The compiler option (`-fsanitizer=address`) and runtime environment flag can be used to introduce a new "shipping gate." Subsequently, COE can then be used with all your existing tests. The developer gets a simple, well-defined, pass/fail for shipping any C or C++ app on Windows. - -Internally we have found that using this technology significantly reduces memory safety errors. If all your existing tests pass, _ **but** _ this new feature reports a memory safety error or a leak, don't ship your new code or integrate it into a parent branch. - -# **Example** - -```cpp -#include -#include - -struct Base -{ - //virtual ~Base() = default; -}; - -struct Derived : public Base -{ - std::wstring Value = L"Leaked if Base destructor is not virtual!"; -}; - -constexpr size_t PointDims = 3; -double pointsInGlobalData[PointDims] = { 1.0, 2.0, 3.0 }; - -int main() -{ - pointsInGlobalData[3] = 3.0; - for (int i = 0; i < 2; i++) - { - double pointOnStack[PointDims] = { 1.0, 2.0, 3.0 }; - pointOnStack[-1] = 3.0; - pointOnStack[PointDims] = 0.0; - - double* pointOnHeap = new double[PointDims + 100000]; - pointOnHeap[-1] = 4.0; - delete[] pointOnHeap; - - double* pointDoubleFree = new double[PointDims] { 1.0, 2.0, 3.0 }; - pointDoubleFree[PointDims] = 4.0; - delete[] pointDoubleFree; - Base* base = new Derived(); - delete base; // missing virtual destrucor - constexpr size_t buff_size = 128; - char* buffer = new char[buff_size]; - std::memset(buffer, '\0', buff_size); - std::memset(&buffer[buff_size - 28], '=', 30); - } - wprintf_s(L"Loop completed!\r\n"); -} - -_ **Figure 3** _ - -With Continue On Error, the program in Figure 3 above, produces the summary in Figure 4. That summary is printed _ **after** _ streaming all unique detailed error reports which are produced using the existing default mode of the Address Sanitizer. The existing default mode is "one-n-done". The previous Address Sanitizer only prints one detailed error report, and then exits your process. With Continue On Error, we continue to execute after various memory safety errors. This summary illustrates continuing after many memory safety errors: - -![](RackMultipart20230703-1-hvjsrt_html_d751003cd5ba2429.png) - -_ **Figure 4** _ - -Beneath the first red box at the top of Figure 4, there are three files sorted by error. This is followed by the file, function, and line displayed beneath the second box. The third box calls out eight unique errors--where unique is defined in terms of a hash function which uses call stacks and error descriptions. Use of the term [unique](#_Unique) is discussed in the next section. - -The detailed error reports (omitted in the screen capture in Figure 4) are printed before this summary and contain shadow bytes with all the details for each error in the summary. - -# Unique - -The uniqueness of an error (to limit streaming duplicates) is determined by an internal **hash function** that uses the type of error and the call stack(s) at the time of error. A detailed individual error report includes stack trace(s). Here are the two detailed errors in the "secure by coincidence" example in Figure 1. The call stacks and types of errors are used to internally create an internal C++ error object, which is then hashed to a unique integer. The global-buffer-overflow in Figure 5 only has one call stack and is a different type of error object from the heap-buffer-overflow in Figure 6, which has two call stacks. - -![](RackMultipart20230703-1-hvjsrt_html_f8328130dd6458f.png) - -_ **Figure 5** _ - -![](RackMultipart20230703-1-hvjsrt_html_814ba706fac2d9d1.png) - -_ **Figure 6** _ - -The runtime will hash each occurrence of an error at runtime in order to prevent duplication. Consider a [memory-safety](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) error that's executed 10000 times in a loop. The detailed error will be reported once, but its "hit count" of 1000 will be reported in the summary. - -# Not continuing. - -Two examples where the continue on error feature _ **cannot continue** _ are: - -- Malloc is given an undefined argument, such as a negative number. -- There's an AV while trying to read or write to memory that hasn't been allocated, or to which it doesn't have access. - -Consider the following program which has an AV because it tries to read from location 0x13: - -```cpp -#include - -void main() -{ - unsigned int* local_ptr = (unsigned int*) 0x13; - printf("use of undefined address %p [%x]\n", local_ptr, *local_ptr); -} -``` - -_ **Figure 7** _ - -On Windows 11, when the example in Figure 7 above, is compiled with -fsanitize=address -Zi, you'll see the following error message in Figure 8, below. - -![](RackMultipart20230703-1-hvjsrt_html_d1427cf52a5c06fe.png) - -_ **Figure 8** _ - -We choose to "gracefully cancel" the attempt to continue from AV's that are **not** caught with a user's structured exception handling. - -# Matching undefined behavior - -We haven't been able to do a complete audit that would allow us to "match" undefined behaviors for C and C++. The following example in Figure 9, makes this tangible. At the commentedline in the following code example, code generation from the compiler and the runtime implementation are both different for **_alloca** when compiling with -fsanitize=address -Zi: +The ASAN runtime doesn't mimic all undefined behaviors for C and C++. The following example demonstrates an example where code generation from the compiler and the runtime implementation differ for **_alloca**: ```cpp #include @@ -299,7 +157,6 @@ int foo_redundant(unsigned long arg_var) a = (char *) _alloca(arg_var); memset(a, 0, 10); } - ret = RET_FINISH; } __except(1) @@ -311,7 +168,6 @@ int foo_redundant(unsigned long arg_var) ret = RET_STACK_EXCEPTION; } } - return ret; } @@ -327,50 +183,25 @@ void main() if (cnt == 1) { printf("pass\n"); - ] + } else { printf("fail\n"); } } -_ **Figure 9** _ - -The previous example, in Figure 9, prints **pass** without -fsanitize=address. That's because **cnt==1** due to an exception. It will fail when compiled with that flag and run with the Address Sanitizer runtime. In main() we pass a large number to foo_redundant, which is passed to _alloca(). - -With the Address Sanitizer in Continue On Error (COE) mode, this program runs to completion, but prints **fail**. The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow (i.e., wrap around) creating a reasonable, small positive number as the parameter to _alloca. - -**There will be no stack overflow exception to process the __except handler.`** - -We have not had time to document or clearly define the subtle differences when a program has undefined behavior. This was a reason for releasing Continue On Error as experimental at first. +``` -**NOTE: The frequency with which this concern has become visible, has been rare with our testing infrastructure.** +In `main()`, a large number is passed to `foo_redundant` which is ultimately passed to `_alloca()` which causes `_alloca()` to fail. -# Top Concern – don't ship without it. +This example outputs `pass` when compiled without the `-fsanitize=address` switch because `cnt==1` due to the exception. However, it will fail when compiled with `-fsanitize=address` because with the Address Sanitizer in Continue On Error mode, the program will run to completion. -There were six categories of C++ [memory safety](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) errors in the 2021 Common Weakness Enumeration (CWE) [Top 25 Most Dangerous Software Weaknesses](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fcwe.mitre.org%2Ftop25%2Farchive%2F2021%2F2021_cwe_top25.html&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=ZWphesh6v9f2PKasnd2qxKrq26EebWpv8Tb6JK1RFXg%3D&reserved=0). The best [Remote Code Execution Bug](https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpwnies.com%2Fwinners%2F&data=05%7C01%7Cjradigan%40microsoft.com%7C9962b611c58546f2df3308db4add742b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638186087241566753%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sdata=%2BbYI%2FqxTAHAPZzkmdmnFgpaQ%2Bb4%2B1a953XrBDUVZ9OI%3D&reserved=0) was a 20 year old heap-buffer-overflow. This award in 2022 went to BugHunter010 at Cyber KunLun Lab. This engineer discovered a heap-buffer-overflow vulnerability in the RPC protocol with CVSS score 9.8. This bug has existed in the Windows system for more than 20 years. There are new C++ memory safety bugs introduced daily because traditional testing can't expose these types of bugs without compiler and runtime support. +The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow creating a reasonable, small positive number as the parameter to `_alloca()`. Thus there is no stack overflow exception to process. -This new feature is designed to enable developers to implement a simple new gate for shipping C++ on Windows. Using this technology will significantly reduce memory safety errors. If your tests pass but Continue On Error reports any hidden memory safety errors, you should not ship or integrate new code into the development branch. +## Other benefits -**We intend that Continue On Error be used as pass/fail gate, for all CI/CD pipelines using C and C++.** +Earlier versions of ASAN required the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. This makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. ## See also -[top concern](#_Top_Concern_%E2%80%93) -[Memory safety errors](https://learn.microsoft.com/en-us/cpp/sanitizers/asan?view=msvc-170#error-types) - - -SPARE PARTS - -Visual Studio 17.6 introduced an experimental Address Sanitizer (ASAN) feature called Continue On Error (COE). You compile as before but with the the compiler flag `-fsanitizer=address.` With Visual Studio 17.6, you enable Continue On Error by setting environment variables from the command line. - -If you are familiar with earlier versions of ASAN, you know that you needed the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. Which makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. - -In the Visual Studio development environment, set the compiler switch [/fsanitizer=address](../build/reference/fsanitize.md): - -1. Open your project's **Property Pages** dialog box. -1. Select the **Configuration Properties** > **C/C++** > **General** property page. -1. Modify the **Enable Address Sanitizer** property. To enable it, choose Yes (/fsanitize=address). -1. Choose OK to save your changes. - -Build the app from the main menu with **Build** > **Build Solution**. - +[Example memory safety errors](asan.md#error-types)\ +[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html) \ No newline at end of file From d1a55945c254edf079312aa64345d828dba32425 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 13 Jul 2023 14:33:13 -0700 Subject: [PATCH 0008/1931] finish draft --- docs/sanitizers/asan-continue-on-error.md | 51 +++++++++++------------ 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 02433036db..e24914fb93 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -8,19 +8,19 @@ helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compilin # Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues -Memory safety errors--such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on--are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) +Memory safety errors such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) -Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to stdout, stderr, or the log file of your choice. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or the log file of your choice. -A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, it notes the error and continues to run. When your app exits, a summary of all the memory issues that were encountered is provided. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and continues to run. After your app exits, a summary of all the memory issues is provided. -You can create a checked build for your C and C++ programs with ASAN turned on that you run in your test harness. As your tests exercise the code paths in your app for bugs, you'll also find out if those code paths also harbor memory safety issues. And without interfering with the tests. +You can create a checked build for your C and C++ programs with ASAN turned on and run in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues. And without interfering with the tests. -Afterwards, you get a summary of the memory issues encountered. With COE, you can compile and deploy an existing application into limited production to find memory safety issues while running for days (albeit the app will run slower). +Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. -You can use this feature to create a new shipping gate: if all your existing tests pass but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. +You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code that has memory safety errors. +This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code with memory safety errors. ## Prerequisites @@ -28,9 +28,9 @@ To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the ## Out of bounds memory access example -When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors--with zero false positives--as your app runs. +When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. -In this example, create a checked build and set an environment variable to output the address sanitizer information to `stdout`. +In this example, create a checked build and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. ### Create a checked build with ASAN enabled @@ -60,24 +60,22 @@ void main() } ``` -In the preceding code, the parameter `sz` is 10 and the original buffer is 10 bytes. There are two memory safety errors that we will see if COE finds: +In the preceding code, the parameter `sz` is 10 and the original buffer is 10 bytes. There are two memory safety errors: - an out-of-bounds load from `buf` in the `for` loop - an out-of-bounds store to `local` in the `for` loop -The buffer buffer overflow is due to the loop exit test `<=sz`. When the example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop" which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. +The buffer overflow is due to the loop exit test `<=sz`. When this example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop", which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. -Errors are only observable if the following page is unmapped, or upon use of corrupted data. All other cases are silent in the following example. With Continue On Error, you see both errors in the summary and the program will run to completion. +Errors are only observable if the following page is unmapped, or upon use of corrupted data. All other cases are silent in this example. With Continue On Error, you see both errors in the summary after the program runs to completion. Create a checked build of the preceding code with COE turned on: -1. Compile the code using the `-fsanitize=address` (turn on COE) and `-Zi` (create a separate PDB file) switches: `cl -fsanitize=address -Zi coe.cpp` +1. Compile the code using the `-fsanitize=address` (turns on COE) and `-Zi` (creates a separate PDB file that address sanitizer uses to display memory error location information) switches: `cl -fsanitize=address -Zi coe.cpp` 1. Set the `ASAN_OPTIONS` environment variable to send ASAN output to stdout: `set ASAN_OPTIONS=Continue On Error=1` 1. Run the test code: `coe.exe` -The output shows that there were two memory buffer overflow errors, as expected, and gives the call stack for where they happened. - -COE reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. The report looks like this: +The output shows that there were two memory buffer overflow errors and gives the call stack for where they happened. The report starts out like this: ```cmd ==9776==ERROR: AddressSanitizer: global-buffer-overflow on address 0x0047b08a at pc 0x003c121b bp 0x012ffaec sp 0x012ffae0 @@ -93,7 +91,7 @@ Next, there's information about the shadow bytes in the vicinity of the buffer o Then there's a summary of the source files where the memory errors happened. It's sorted in order of the unique call stacks for the memory errors in that file. What determines a unique call stack is the type of error and the call stack where the error occurred. -The reason for this sorting is that five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: +The reason for this sorting is to prioritize memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: ```cmd === Files in priority order === @@ -101,7 +99,7 @@ The reason for this sorting is that five unique call stacks leading to different File: C:\Users\xxx\Desktop\COE\coe.cpp Unique call stacks: 2 ``` -Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap.It looks like this: +Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. It looks like this: ```cmd === Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === @@ -119,7 +117,7 @@ File: C:\Users\xxx\Desktop\COE\coe.cpp Raw HitCnt: 1 On Reference: 1-byte-write-heap-buffer-overflow ``` -The default Address Sanitizer runtime behavior terminates your application after reporting the first error encountered while running your program. It does not allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. COE tries to automatically return control back to the application after reporting each memory safety error. There are times when it can't, such as when there is a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that aren't caught by the program's structured exception handling. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. +The default Address Sanitizer runtime behavior terminates the app after reporting the first error it finds. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. COE tries to automatically return control back to the application after reporting each memory safety error. There are situations when it can't, such as when there's a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that the program's structured exception handling doesn't catch. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. ### Set an environment variable to output to stdout @@ -131,7 +129,7 @@ There are different options for where the output from ASAN goes. They are: ## Handling undefined behavior -The ASAN runtime doesn't mimic all undefined behaviors for C and C++. The following example demonstrates an example where code generation from the compiler and the runtime implementation differ for **_alloca**: +The ASAN runtime doesn't mimic all of the undefined behaviors for C and C++. The following example demonstrates an example where code generation from the compiler and the runtime implementation differs for **_alloca**: ```cpp #include @@ -191,17 +189,18 @@ void main() } ``` -In `main()`, a large number is passed to `foo_redundant` which is ultimately passed to `_alloca()` which causes `_alloca()` to fail. - -This example outputs `pass` when compiled without the `-fsanitize=address` switch because `cnt==1` due to the exception. However, it will fail when compiled with `-fsanitize=address` because with the Address Sanitizer in Continue On Error mode, the program will run to completion. +In `main()`, a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. -The code generation from the compiler must match the ABI for the Address Sanitizer runtime. For the Address Sanitizer runtime, the compiler grows the allocation size and aligns it 0 mod 32 (a cache line). That math will cause an integer overflow creating a reasonable, small positive number as the parameter to `_alloca()`. Thus there is no stack overflow exception to process. +This example outputs `pass` when compiled without the `-fsanitize=address` switch because `cnt==1` because the exception code matches `RET_STACK_EXCEPTION`. However, it fails when compiled with `-fsanitize=address` because the thrown exception is an Address Sanitizer error: dynamic-stack-buffer-overflow. So the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION`. ## Other benefits -Earlier versions of ASAN required the `llvm_symbolzer.exe` binary. With the new ASAN runtime, this is no longer necessary. This makes it even easier to use ASAN with your normal test harness because you don't have to accomodate extra binaries. +Earlier versions of ASAN required the `llvm_symbolizer.exe` binary. With the new ASAN runtime, this isn't necessary. This makes it even easier to use ASAN with your normal test harness because you don't have to manage extra binaries. ## See also +[AddressSanitizer Continue on Error blog post](https://devblogs.microsoft.com/cppblog/addresssanitizer-continue_on_error)\ [Example memory safety errors](asan.md#error-types)\ -[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html) \ No newline at end of file +[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html)\ +[-Zi](../build/reference/z7-zi-zi-debug-information-format.md#zi)\ +[-fsanitize=address](../build/reference/fsanitize.md) \ No newline at end of file From 29bafb44c7d646c70d3fd8c3e9b0ab7d1697712d Mon Sep 17 00:00:00 2001 From: Luca <681992+lukka@users.noreply.github.com> Date: Thu, 20 Jul 2023 16:42:13 -0700 Subject: [PATCH 0009/1931] Learn Editor: Update advanced-property-page.md --- docs/build/reference/advanced-property-page.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index 8ac6bdc9b4..c347a34719 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -4,6 +4,7 @@ title: "Advanced Property Page (Project)" ms.date: 08/31/2022 f1_keywords: ["VC.Project.VCConfiguration.TargetExt", "VC.Project.VCConfiguration.DeleteExtensionsOnClean", "VC.Project.VCConfiguration.BuildLogFile", "VC.Project.VCConfiguration.PreferredToolArchitecture", "VC.Project.VCConfiguration.UseDebugLibraries", "VC.Project.VCConfiguration.EnableUnitySupport", "VC.Project.VCConfiguration.CopyLocalDeploymentContent", "VC.Project.VCConfiguration.CopyLocalProjectReference", "VC.Project.VCConfiguration.CopyLocalDebugSymbols", "VC.Project.VCConfiguration.CopyCppRuntimeToOutputDir", "VC.Project.VCConfiguration.useOfMfc", "VC.Project.VCConfiguration.CharacterSet", "VC.Project.VCConfiguration.WholeProgramOptimization", "VC.Project.VCConfiguration.VCToolsVersion", "VC.Project.VCConfiguration.LLVMToolsVersion", "VC.Project.VCConfiguration.ManagedExtensions", "VC.Project.TargetFrameworkVersion", "VC.Project.VCConfiguration.EnableManagedIncrementalBuild", "VC.Project.VCConfiguration.ManagedAssembly"] --- + # Advanced Property Page ::: moniker range="<=msvc-150" @@ -106,7 +107,7 @@ To programmatically access this property, see Date: Thu, 20 Jul 2023 16:46:08 -0700 Subject: [PATCH 0010/1931] Update advanced-property-page.md drop a blank space --- docs/build/reference/advanced-property-page.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index c347a34719..59f9120953 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -119,7 +119,7 @@ This option sets a `ManagedAssembly` build property that enables building only s ### .NET Target Windows Version -In managed projects targeting .NET (not .NET Framework), specifies the minimum Windows version that the project could leverage. The value is used by NuGet when determining the compatibility of projects and NuGet packages in the dependencies graph: the rule is that a project A depending on project B must have a .NET target Windows version greater or equal than the depending one. +In managed projects targeting .NET (not .NET Framework), specifies the minimum Windows version that the project could leverage. The value is used by NuGet when determining the compatibility of projects and NuGet packages in the dependencies graph: the rule is that a project A depending on project B must have a .NET target Windows version greater or equal than the depending one. ::: moniker-end From 9433d8814ed5834d8635f1b5bdc8052bb3367c99 Mon Sep 17 00:00:00 2001 From: Luca <681992+lukka@users.noreply.github.com> Date: Thu, 20 Jul 2023 17:52:30 -0700 Subject: [PATCH 0011/1931] Update advanced-property-page.md address PR feedback --- docs/build/reference/advanced-property-page.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index 59f9120953..45bae0294a 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -107,7 +107,7 @@ To programmatically access this property, see Date: Fri, 21 Jul 2023 19:51:48 +0200 Subject: [PATCH 0012/1931] Suggestion for a better example program (#4641) The format string in the printf_s explains what __umulh does better, visually speaking, by zero-padding all 64-bit values and separating the high and low parts of the product. --- docs/intrinsics/umulh.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/intrinsics/umulh.md b/docs/intrinsics/umulh.md index 0ee0124923..6aa9851d39 100644 --- a/docs/intrinsics/umulh.md +++ b/docs/intrinsics/umulh.md @@ -62,13 +62,13 @@ int main() unsigned __int64 result; result = __umulh(i, j); // result has the high 64 bits // of the product. - printf_s("0x%I64x * 0x%I64x = 0x%I64x%I64x \n", i, j, result, k); + printf_s("0x%016I64x * 0x%016I64x = 0x%016I64x_%016I64x \n", i, j, result, k); return 0; } ``` ```Output -0x10 * 0xfedcba9876543210 = 0xfedcba98765432100 +0x0000000000000010 * 0xfedcba9876543210 = 0x000000000000000f_edcba98765432100 ``` **END Microsoft Specific** From ef46cccd0068d10af862af49f4fb8778f3904bf1 Mon Sep 17 00:00:00 2001 From: cgettys-microsoft <67080058+cgettys-microsoft@users.noreply.github.com> Date: Fri, 21 Jul 2023 12:27:51 -0700 Subject: [PATCH 0013/1931] Fix Unintentional spacing, improve wording My first PR added an unintended space in line 46. also improve wording --- docs/error-messages/compiler-warnings/c4834.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/error-messages/compiler-warnings/c4834.md b/docs/error-messages/compiler-warnings/c4834.md index bbee0c7b7c..3489f6f16b 100644 --- a/docs/error-messages/compiler-warnings/c4834.md +++ b/docs/error-messages/compiler-warnings/c4834.md @@ -44,10 +44,10 @@ int main() square_of(42); // warning C4834: discarding return value of function with 'nodiscard' attribute // If ignoring the [[nodiscard] attribute is unintentional, to fix the warning, make use of the return value, as shown here: // std::cout << "square_of(42) = " << square_of(42) << "\n"; - // If discarding the nodiscard value is intentional, but you cannot fix it another way (for example, if the function marked [[nodiscard]] is from a third-party dependency), you can also suppress the warning by assigning to std::ignore, as shown here: - // std::ignore = square_of(42); // Ok, C++ 11 and higher - // You can also suppress the warning by casting the return result to (void), but the intent of the cast may not be clear. This may produce warning C26457 depending on your code analysis settings. - // (void) square_of(42); // warning C26457 if enabled + // If discarding the nodiscard value is intentional, but you cannot fix it another way (for example, if the function marked [[nodiscard]] is from a third-party dependency), you can also suppress the warning by assigning the return value to std::ignore, as shown here: + // std::ignore = square_of(42); // Ok, C++ 11 and higher + // You can also suppress the warning by casting the return value to void, but it may be less clear that the intent is to discard the result. Depending on your code analysis settings, casting to void may produce warning C26457. + // (void) square_of(42); // Will not produce warning C4834, may produce warning C26457 return 0; } ``` From ec0a856d5655171dad904b1a8a025dcf69aec0c9 Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Fri, 21 Jul 2023 15:56:20 -0400 Subject: [PATCH 0014/1931] Update asan-debugger-integration.md --- docs/sanitizers/asan-debugger-integration.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/sanitizers/asan-debugger-integration.md b/docs/sanitizers/asan-debugger-integration.md index fac6f39fc9..65ede003d9 100644 --- a/docs/sanitizers/asan-debugger-integration.md +++ b/docs/sanitizers/asan-debugger-integration.md @@ -40,11 +40,11 @@ Here's what happens when a dump file is specified for `ASAN_SAVE_DUMPS`: If an e In Visual Studio version 17.7 and later, these capabilities were expanded to handle a variety of scenarios: -1. Quotes will be stripped to accommodate spaces in directory or file names. In previous versions depending on the environment, setting the environment variable to have quotes or spaces would not work. +1. Quotes will be stripped to accommodate spaces in directory or file names. In previous versions for environments inside of Visual Studio or when using PowerShell, setting the environment variable to have quotes or spaces would not work. -1. If the `.dmp` extension is explicitly entered, VCAsan will try to use that explicitly and not add an associated process ID to the dump file name. +2. If the `.dmp` extension is explicitly specified (e.g. `set ASAN_SAVE_DUMPS=MyDmp.dmp`), VCAsan will try to use that explicitly and not add an associated process ID to the dump file name. -1. If somehow a dmp already exists, VCAsan will attempt to write to a different file name similar to other Windows programs by appending a number in parentheses. If this does not work after several attempts, a temporary path will be used. If they all fail, an error message is displayed with diagnostic information. +3. If somehow a dmp file already exists with the same name, VCAsan will attempt to write to a different file name similar to other Windows programs by appending a number in parentheses. If this does not work after several attempts, a temporary path is used. If they all fail, an error message is displayed with diagnostic information. This applies in all scenarios. ## See also From 6884fd386afde1c248f96b737ded74745974494b Mon Sep 17 00:00:00 2001 From: cgettys-microsoft <67080058+cgettys-microsoft@users.noreply.github.com> Date: Fri, 21 Jul 2023 12:58:12 -0700 Subject: [PATCH 0015/1931] Overhaul Example for legibility --- .../error-messages/compiler-warnings/c4834.md | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/docs/error-messages/compiler-warnings/c4834.md b/docs/error-messages/compiler-warnings/c4834.md index 3489f6f16b..7f6329caa4 100644 --- a/docs/error-messages/compiler-warnings/c4834.md +++ b/docs/error-messages/compiler-warnings/c4834.md @@ -13,7 +13,8 @@ helpviewer_keywords: ["C4834"] Starting in the C++17 Standard, the `[[nodiscard]]` attribute specifies that a function's return value isn't intended to be discarded. If a caller discards the return value, the compiler generates warning C4834. -To resolve this warning, consider why your code doesn't use the return value. Your use of the function may not match its intent. You can circumvent the warning by assigning the value to **`std::ignore`** or by using a cast to **`void`** (see [Warning C26457](../../code-quality/c26457.md)). +To resolve this warning, consider why your code doesn't use the return value. Your use of the function may not match its intent. You can circumvent the warning by assigning the value to **`std::ignore`** or by casting it to **`void`** if discarding the value is intentional. +Assignment to **`std::ignore`** is preferred over casting to **`void`** in C++ 11 and higher, as it makes your intent clearer and will not trigger [Warning C26457](../../code-quality/c26457.md) if enabled in your code analysis settings. This warning was introduced in Visual Studio 2017 version 15.3 as a level 3 warning. It was changed to a level 1 warning in Visual Studio 2017 version 15.7. Code that compiled without warnings in versions of the compiler before Visual Studio 2017 version 15.3 can now generate C4834. For information on how to disable warnings introduced in a particular compiler version or later, see [Compiler warnings by compiler version](compiler-warnings-by-compiler-version.md). @@ -29,7 +30,7 @@ To turn off the warning for an entire project in the Visual Studio IDE: ## Example -This sample generates C4834, and shows three ways to fix it: +This sample generates C4834, and shows four ways to fix it: ```cpp // C4834.cpp @@ -39,15 +40,23 @@ This sample generates C4834, and shows three ways to fix it: [[nodiscard]] int square_of(int i) { return i * i; } + int main() { square_of(42); // warning C4834: discarding return value of function with 'nodiscard' attribute - // If ignoring the [[nodiscard] attribute is unintentional, to fix the warning, make use of the return value, as shown here: - // std::cout << "square_of(42) = " << square_of(42) << "\n"; - // If discarding the nodiscard value is intentional, but you cannot fix it another way (for example, if the function marked [[nodiscard]] is from a third-party dependency), you can also suppress the warning by assigning the return value to std::ignore, as shown here: - // std::ignore = square_of(42); // Ok, C++ 11 and higher - // You can also suppress the warning by casting the return value to void, but it may be less clear that the intent is to discard the result. Depending on your code analysis settings, casting to void may produce warning C26457. - // (void) square_of(42); // Will not produce warning C4834, may produce warning C26457 + // If ignoring the [[nodiscard] attribute is unintentional, make use of the return value as intended: + // For example: + std::cout << "square_of(42) = " << square_of(42) << "\n"; // Ok + // Or: + int result = square_of(43); // Ok + std::cout << "square_of(43) = " << result << "\n"; + + // If ignoring the [[nodiscard]] attribute value is intentional, you have two options: + // Preferrably, assign the return value to std::ignore: + std::ignore = square_of(42); // Ok, C++ 11 and higher + // Alternatively, you can cast the return value to void. + // The intent may be less clear to other developers. + (void) square_of(42); // May produce warning C26457 return 0; } ``` From 096a93e0815b396688276b71f9a7f150ac458b47 Mon Sep 17 00:00:00 2001 From: Luca <681992+lukka@users.noreply.github.com> Date: Fri, 21 Jul 2023 13:41:21 -0700 Subject: [PATCH 0016/1931] Update advanced-property-page.md Add the property `.NET Target Framework`, and expand the relation between options and .NET vs .NET Framework. --- docs/build/reference/advanced-property-page.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index 45bae0294a..03f9adf81e 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -107,7 +107,13 @@ To programmatically access this property, see Date: Fri, 21 Jul 2023 13:44:45 -0700 Subject: [PATCH 0017/1931] Update advanced-property-page.md fix typos --- docs/build/reference/advanced-property-page.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index 03f9adf81e..a5a0e5d713 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -111,9 +111,9 @@ This property is applicable only when the **Common Language Runtime support** pr ### .NET Target Framework -This property is applicable only when the **Common Language Runtime support** property is set to **.NET Runtime Support**, that is the project target [.NET](/dotnet/standard/glossary#net). +This property is applicable only when the **Common Language Runtime support** property is set to **.NET Runtime Support**, that is the project targets [.NET](/dotnet/standard/glossary#net). -This property specifies the .NET 5+ Target Framework Moniker this project targets, e.g. `net6.0-windows` or `net7.0-windows8.0`. +This property specifies the .NET 5+ Target Framework Moniker this project targets, e.g., `net6.0-windows` or `net7.0-windows8.0`. ### Enable Managed Incremental Build From 13ae74c25e3f8aa3d661e9b2375ad4f07250bac4 Mon Sep 17 00:00:00 2001 From: Luca <681992+lukka@users.noreply.github.com> Date: Fri, 21 Jul 2023 15:41:02 -0700 Subject: [PATCH 0018/1931] Update advanced-property-page.md grammar fixes --- docs/build/reference/advanced-property-page.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index a5a0e5d713..b9ec9567a5 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -107,13 +107,13 @@ To programmatically access this property, see Date: Fri, 21 Jul 2023 15:42:50 -0700 Subject: [PATCH 0019/1931] Update advanced-property-page.md another grammar fix --- docs/build/reference/advanced-property-page.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index b9ec9567a5..7a046730e0 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -125,7 +125,7 @@ This option sets a `ManagedAssembly` build property that enables building only s ### .NET Target Windows Version -This property is applicable only when the **Common Language Runtime support** property is set to **.NET Runtime Support**, that is the project target [.NET](/dotnet/standard/glossary#net). +This property is applicable only when the **Common Language Runtime support** property is set to **.NET Runtime Support**, that is the project targets [.NET](/dotnet/standard/glossary#net). This property specifies the minimum Windows version that the project supports: this value is used by NuGet to determine the compatibility of projects and NuGet package dependencies. If a project A depends on project B, project A's .NET target Windows version must be greater or equal to project B's. ::: moniker-end From 7d7f5758908e568e99277d9ede195857a543246b Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Mon, 24 Jul 2023 10:18:11 -0400 Subject: [PATCH 0020/1931] Update asan-debugger-integration.md --- docs/sanitizers/asan-debugger-integration.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/sanitizers/asan-debugger-integration.md b/docs/sanitizers/asan-debugger-integration.md index 65ede003d9..2e666ae8af 100644 --- a/docs/sanitizers/asan-debugger-integration.md +++ b/docs/sanitizers/asan-debugger-integration.md @@ -38,13 +38,13 @@ The file must have a `.dmp` extension to follow the Visual Studio IDE convention Here's what happens when a dump file is specified for `ASAN_SAVE_DUMPS`: If an error gets caught by the AddressSanitizer runtime, it saves a crash dump file that has the metadata associated with the error. The debugger in Visual Studio version 16.9 and later can parse the metadata that's saved in the dump file. You can set `ASAN_SAVE_DUMPS` on a per-test basis, store these binary artifacts, and then view them in the IDE with proper source indexing. -In Visual Studio version 17.7 and later, these capabilities were expanded to handle a variety of scenarios: +In Visual Studio version 17.7 and later, these capabilities were expanded to handle various scenarios: -1. Quotes will be stripped to accommodate spaces in directory or file names. In previous versions for environments inside of Visual Studio or when using PowerShell, setting the environment variable to have quotes or spaces would not work. +1. Quotes are stripped to accommodate spaces in directory or file names. In previous versions for environments inside of Visual Studio or when using PowerShell, setting the environment variable to contain quotes or spaces would fail to create the expected dump. -2. If the `.dmp` extension is explicitly specified (e.g. `set ASAN_SAVE_DUMPS=MyDmp.dmp`), VCAsan will try to use that explicitly and not add an associated process ID to the dump file name. +2. If the `.dmp` extension is explicitly specified (for example, `set ASAN_SAVE_DUMPS=MyDmp.dmp`), VCAsan attempts using that explicitly, and will not add an associated process ID to the dump file name. -3. If somehow a dmp file already exists with the same name, VCAsan will attempt to write to a different file name similar to other Windows programs by appending a number in parentheses. If this does not work after several attempts, a temporary path is used. If they all fail, an error message is displayed with diagnostic information. This applies in all scenarios. +3. If a `.dmp` file already exists with the same name specified from the environment variable, VCAsan tries to append a number in parentheses similar to other Windows programs (for example, `MyDmp (1).dmp`. If file creation does not work after several attempts, a temporary path is used. If file creation continues to fail, an error message is displayed with diagnostic information. This applies for all VCAsan scenarios. ## See also From c80da83618817f3dcbc551c6d4e7bb73868b931a Mon Sep 17 00:00:00 2001 From: melody Date: Tue, 25 Jul 2023 02:34:05 +0800 Subject: [PATCH 0021/1931] docs: few minor fixes. (#4647) * docs: corrected a small grammar mistake Corrected a small grammar mistake found in the documentation related to the extern specifier. melody * docs: added missing comma in example code Added a missing comma in the documentation related to C Type Specifiers. * docs: added missing comma in example code Added a missing comma in the documentation related to declarators and variable declarations. * docs: remove unnecessary forward slash in code example Removed an unnecessary forward slash in the code example provided in the documentation related to C enumeration declarations. --- docs/c-language/c-enumeration-declarations.md | 2 +- docs/c-language/c-type-specifiers.md | 2 +- docs/c-language/declarators-and-variable-declarations.md | 2 +- docs/c-language/extern-storage-class-specifier.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/c-language/c-enumeration-declarations.md b/docs/c-language/c-enumeration-declarations.md index 6f9153022e..77dc5ee661 100644 --- a/docs/c-language/c-enumeration-declarations.md +++ b/docs/c-language/c-enumeration-declarations.md @@ -103,7 +103,7 @@ enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */ This declaration can also be specified as ```C -enum BOOLEAN { false, true } end_flag, match_flag;\ +enum BOOLEAN { false, true } end_flag, match_flag; ``` or as diff --git a/docs/c-language/c-type-specifiers.md b/docs/c-language/c-type-specifiers.md index 92381bf7aa..7ce692047e 100644 --- a/docs/c-language/c-type-specifiers.md +++ b/docs/c-language/c-type-specifiers.md @@ -55,7 +55,7 @@ The Microsoft C compiler also generates warnings for differences in sign. For ex ```C signed int *pi; -unsigned int *pu +unsigned int *pu; pi = pu; /* Now generates warning */ ``` diff --git a/docs/c-language/declarators-and-variable-declarations.md b/docs/c-language/declarators-and-variable-declarations.md index 7e6b77ad58..d8c27aab0a 100644 --- a/docs/c-language/declarators-and-variable-declarations.md +++ b/docs/c-language/declarators-and-variable-declarations.md @@ -67,7 +67,7 @@ int list[20]; // Declares an array of 20 int values named list char *cp; // Declares a pointer to a char value double func( void ); // Declares a function named func, with no // arguments, that returns a double value -int *aptr[10] // Declares an array of 10 pointers +int *aptr[10]; // Declares an array of 10 pointers ``` **Microsoft Specific** diff --git a/docs/c-language/extern-storage-class-specifier.md b/docs/c-language/extern-storage-class-specifier.md index 749c6227ae..cfcf2a0c38 100644 --- a/docs/c-language/extern-storage-class-specifier.md +++ b/docs/c-language/extern-storage-class-specifier.md @@ -49,7 +49,7 @@ void func(void) } ``` -In this example, the variable `i` is defined in Source1.c with an initial value of 1. An **`extern`** declaration in Source2.c is makes 'i' visible in that file. +In this example, the variable `i` is defined in Source1.c with an initial value of 1. An **`extern`** declaration in Source2.c makes 'i' visible in that file. In the `func` function, the address of the global variable `i` is used to initialize the **`static`** pointer variable `external_i`. This works because the global variable has **`static`** lifetime, meaning its address does not change during program execution. Next, a variable `i` is defined within the scope of `func` as a local variable with initial value 16. This definition does not affect the value of the external-level `i`, which is hidden by the use of its name for the local variable. The value of the global `i` is now accessible only through the pointer `external_i`. From bbf39289124cb5c5bb07e7574b34fbe0442825ef Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Mon, 24 Jul 2023 14:39:20 -0400 Subject: [PATCH 0022/1931] Update asan-debugger-integration.md --- docs/sanitizers/asan-debugger-integration.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/sanitizers/asan-debugger-integration.md b/docs/sanitizers/asan-debugger-integration.md index 2e666ae8af..b4cf2be6b9 100644 --- a/docs/sanitizers/asan-debugger-integration.md +++ b/docs/sanitizers/asan-debugger-integration.md @@ -38,13 +38,16 @@ The file must have a `.dmp` extension to follow the Visual Studio IDE convention Here's what happens when a dump file is specified for `ASAN_SAVE_DUMPS`: If an error gets caught by the AddressSanitizer runtime, it saves a crash dump file that has the metadata associated with the error. The debugger in Visual Studio version 16.9 and later can parse the metadata that's saved in the dump file. You can set `ASAN_SAVE_DUMPS` on a per-test basis, store these binary artifacts, and then view them in the IDE with proper source indexing. -In Visual Studio version 17.7 and later, these capabilities were expanded to handle various scenarios: +Visual Studio version 17.7 and later supports the following: -1. Quotes are stripped to accommodate spaces in directory or file names. In previous versions for environments inside of Visual Studio or when using PowerShell, setting the environment variable to contain quotes or spaces would fail to create the expected dump. +* Quoted strings are now handled correctly. In previous versions, for environments inside of Visual Studio or when using PowerShell, setting the environment variable to contain quotes or spaces would fail to create the expected dump file. -2. If the `.dmp` extension is explicitly specified (for example, `set ASAN_SAVE_DUMPS=MyDmp.dmp`), VCAsan attempts using that explicitly, and will not add an associated process ID to the dump file name. +* When the `.dmp` extension is explicitly specified (for example, `set ASAN_SAVE_DUMPS=MyDmp.dmp`), VCAsan uses it explicitly, and will not add an associated process ID to the dump file name. -3. If a `.dmp` file already exists with the same name specified from the environment variable, VCAsan tries to append a number in parentheses similar to other Windows programs (for example, `MyDmp (1).dmp`. If file creation does not work after several attempts, a temporary path is used. If file creation continues to fail, an error message is displayed with diagnostic information. This applies for all VCAsan scenarios. +* If a `.dmp` file already exists with the same name specified from the environment variable, VCAsan modifies the file name as follows: + * Appends a number to the filename in parentheses. For example, `Myfile (1).dmp`. + * If after several attempts appending a number in parentheses fails to generate a unique name, the file is saved to an `%APPLOCAL%` temporary path. + * If saving to a temporary path fails, a diagnostic error is displayed. ## See also From 80dff49b3e159b4c78c5d295a7f00dcb1551ec08 Mon Sep 17 00:00:00 2001 From: Zack Johnson Date: Mon, 24 Jul 2023 16:16:04 -0400 Subject: [PATCH 0023/1931] Update asan-debugger-integration.md --- docs/sanitizers/asan-debugger-integration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sanitizers/asan-debugger-integration.md b/docs/sanitizers/asan-debugger-integration.md index b4cf2be6b9..8232ebff54 100644 --- a/docs/sanitizers/asan-debugger-integration.md +++ b/docs/sanitizers/asan-debugger-integration.md @@ -46,7 +46,7 @@ Visual Studio version 17.7 and later supports the following: * If a `.dmp` file already exists with the same name specified from the environment variable, VCAsan modifies the file name as follows: * Appends a number to the filename in parentheses. For example, `Myfile (1).dmp`. - * If after several attempts appending a number in parentheses fails to generate a unique name, the file is saved to an `%APPLOCAL%` temporary path. + * If after several attempts appending a number in parentheses fails to generate a unique name, the file is saved to an `%APPLOCAL%` temporary path that VCAsan will print. For example, `C:\Users\~\AppData\Local\Temp\Dump.dmp`. * If saving to a temporary path fails, a diagnostic error is displayed. ## See also From 943e93a3649e09d6020044bc3c45c6b7a2a478f4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 24 Jul 2023 13:44:47 -0700 Subject: [PATCH 0024/1931] draft --- docs/sanitizers/asan-continue-on-error.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index e24914fb93..973c3bef3c 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -16,7 +16,7 @@ A significant advantage of COE is that, unlike the previous ASAN behavior, your You can create a checked build for your C and C++ programs with ASAN turned on and run in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues. And without interfering with the tests. -Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. +Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app runs slower due to the ASAN instrumentation. You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. @@ -65,7 +65,7 @@ In the preceding code, the parameter `sz` is 10 and the original buffer is 10 by - an out-of-bounds load from `buf` in the `for` loop - an out-of-bounds store to `local` in the `for` loop -The buffer overflow is due to the loop exit test `<=sz`. When this example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop", which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. +The buffer overflow is due to the loop exit test `<=sz`. When this example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop," which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. Errors are only observable if the following page is unmapped, or upon use of corrupted data. All other cases are silent in this example. With Continue On Error, you see both errors in the summary after the program runs to completion. From 4bae96f07a6a8f759dc5b167692f5edc645d3f7e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 24 Jul 2023 13:47:42 -0700 Subject: [PATCH 0025/1931] fix github 4640 --- docs/c-runtime-library/stdin-stdout-stderr.md | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/docs/c-runtime-library/stdin-stdout-stderr.md b/docs/c-runtime-library/stdin-stdout-stderr.md index 466b85a7fb..af80dbea9e 100644 --- a/docs/c-runtime-library/stdin-stdout-stderr.md +++ b/docs/c-runtime-library/stdin-stdout-stderr.md @@ -1,20 +1,18 @@ --- -description: "Learn more about: stdin, stdout, stderr" +description: "Learn more about the definitions of: stdin, stdout, stderr" title: "stdin, stdout, stderr" -ms.date: "10/23/2018" +ms.date: "7/24/2023" f1_keywords: ["CORECRT_WSTDIO/stdin", "CORECRT_WSTDIO/stderr", "CORECRT_WSTDIO/stdout", "stdin", "stderr", "stdout"] helpviewer_keywords: ["stdout function", "standard output stream", "standard error stream", "stdin function", "standard input stream", "stderr function"] -ms.assetid: badd4735-596d-4498-857c-ec8b7e670e4c --- # `stdin`, `stdout`, `stderr` ## Syntax ```C -FILE *stdin; -FILE *stdout; -FILE *stderr; -#include +#define stdin (__acrt_iob_func(0)) +#define stdout (__acrt_iob_func(1)) +#define stderr (__acrt_iob_func(2)) ``` ## Remarks From 38c6dd450569ca3bbb939d33dc9133bb32f3a7af Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 24 Jul 2023 14:33:17 -0700 Subject: [PATCH 0026/1931] add implementation defined --- docs/c-runtime-library/stdin-stdout-stderr.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/c-runtime-library/stdin-stdout-stderr.md b/docs/c-runtime-library/stdin-stdout-stderr.md index af80dbea9e..b88b099b36 100644 --- a/docs/c-runtime-library/stdin-stdout-stderr.md +++ b/docs/c-runtime-library/stdin-stdout-stderr.md @@ -10,9 +10,9 @@ helpviewer_keywords: ["stdout function", "standard output stream", "standard err ## Syntax ```C -#define stdin (__acrt_iob_func(0)) -#define stdout (__acrt_iob_func(1)) -#define stderr (__acrt_iob_func(2)) +#define stdin /* implementation defined */ +#define stdout /* implementation defined */ +#define stderr /* implementation defined */ ``` ## Remarks From 08bf03cadc9fd4c15940f5c7dce400c53b18073f Mon Sep 17 00:00:00 2001 From: Luca <681992+lukka@users.noreply.github.com> Date: Tue, 25 Jul 2023 17:37:15 +0000 Subject: [PATCH 0027/1931] "is applicable only when" -> "only applies when". Add blank line in paragraph of ".NET Target Windows Version" --- docs/build/reference/advanced-property-page.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/build/reference/advanced-property-page.md b/docs/build/reference/advanced-property-page.md index 7a046730e0..a16df317c1 100644 --- a/docs/build/reference/advanced-property-page.md +++ b/docs/build/reference/advanced-property-page.md @@ -107,11 +107,11 @@ To programmatically access this property, see Date: Wed, 26 Jul 2023 01:54:55 +0800 Subject: [PATCH 0028/1931] docs: updated explanation and corrected minor grammar mistake. Updated explanation to align with code and fix a minor grammar mistake in the documentation related to C Bit Fields. --- docs/c-language/c-bit-fields.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/c-language/c-bit-fields.md b/docs/c-language/c-bit-fields.md index d38c72c40e..932142d301 100644 --- a/docs/c-language/c-bit-fields.md +++ b/docs/c-language/c-bit-fields.md @@ -19,7 +19,7 @@ The *`constant-expression`* specifies the width of the field in bits. The *`type Unnamed bit fields can't be referenced, and their contents at run time are unpredictable. They can be used as "dummy" fields, for alignment purposes. An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the *struct-declaration-list* begins on an **`int`** boundary. -Bit fields must also be long enough to contain the bit pattern. For example, these two statements aren't legal: +Bit fields should not exceed the total number of bits of their underlying type. For example, these two statements aren't legal: ```C short a:17; /* Illegal! */ @@ -72,7 +72,7 @@ the bits of `test` would be arranged as follows: cccccccb bbbbaaaa ``` -Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer `0x01F2` would be stored in physical memory as `0xF2` followed by `0x01`. +Since the 8086 family of processors store the low byte of integer values before the high byte, the integer `0x01F2` would be stored in physical memory as `0xF2` followed by `0x01`. The ISO C99 standard lets an implementation choose whether a bit field may straddle two storage instances. Consider this structure, which stores bit fields that total 64 bits: From 532242a39f2c9cf70a2ff4cf755c821ce9947f6f Mon Sep 17 00:00:00 2001 From: melody Date: Wed, 26 Jul 2023 02:01:15 +0800 Subject: [PATCH 0029/1931] docs: clarify description regarding default size. Clarify the description regarding the default size in the documentation related to Storage and Alignment of Structures. --- docs/c-language/storage-and-alignment-of-structures.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/c-language/storage-and-alignment-of-structures.md b/docs/c-language/storage-and-alignment-of-structures.md index 1032e70a32..e48c280822 100644 --- a/docs/c-language/storage-and-alignment-of-structures.md +++ b/docs/c-language/storage-and-alignment-of-structures.md @@ -27,7 +27,7 @@ where *n* is the packing size expressed with the /Zp[*n*] option and *item* is t To use the `pack` pragma to specify packing other than the packing specified on the command line for a particular structure, give the `pack` pragma, where the packing size is 1, 2, 4, 8, or 16, before the structure. To reinstate the packing given on the command line, specify the `pack` pragma with no arguments. -Bit fields default to size **`long`** for the Microsoft C compiler. Structure members are aligned on the size of the type or the /Zp[*n*] size, whichever is smaller. The default size is 4. +For the Microsoft C compiler, bit fields default to a size of 4 bytes, which is a **`long`** data type. Structure members are aligned on the size of the type or the /Zp[*n*] size, whichever is smaller. **END Microsoft Specific** From f92be3668f8cf0d9648c250f5b7f0ea560338b34 Mon Sep 17 00:00:00 2001 From: melody Date: Wed, 26 Jul 2023 02:03:48 +0800 Subject: [PATCH 0030/1931] docs: fixed comment formatting error. Fix a comment formatting error in the documentation related to Union Declarations. --- docs/c-language/union-declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/c-language/union-declarations.md b/docs/c-language/union-declarations.md index 44e127a28d..7a0a0cd01e 100644 --- a/docs/c-language/union-declarations.md +++ b/docs/c-language/union-declarations.md @@ -81,7 +81,7 @@ Nested unions can be declared anonymously when they're members of another struct struct str { int a, b; - union / * Unnamed union */ + union /* Unnamed union */ { char c[4]; long l; From 1cfca6679900fe0c3a07fd390dfd0a3ba7544386 Mon Sep 17 00:00:00 2001 From: melody Date: Wed, 26 Jul 2023 04:33:30 +0800 Subject: [PATCH 0031/1931] docs: updated explanation Updated the explanation to align with the code, taking Tyler's input into account. Thank you, Tyler! --- docs/c-language/c-bit-fields.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/c-language/c-bit-fields.md b/docs/c-language/c-bit-fields.md index 932142d301..ddd8fac1af 100644 --- a/docs/c-language/c-bit-fields.md +++ b/docs/c-language/c-bit-fields.md @@ -19,7 +19,7 @@ The *`constant-expression`* specifies the width of the field in bits. The *`type Unnamed bit fields can't be referenced, and their contents at run time are unpredictable. They can be used as "dummy" fields, for alignment purposes. An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the *struct-declaration-list* begins on an **`int`** boundary. -Bit fields should not exceed the total number of bits of their underlying type. For example, these two statements aren't legal: +The number of bits in a bit field must be less than or equal to the size of the underlying type. For example, these two statements aren't legal: ```C short a:17; /* Illegal! */ From 2345d2c0824b20959cf54cbce70a0c0bf2d6bd9c Mon Sep 17 00:00:00 2001 From: melody Date: Thu, 27 Jul 2023 03:33:40 +0800 Subject: [PATCH 0032/1931] docs: removed unnecessary comment Removed an unnecessary comment in the documentation related to Array Declarations. --- docs/c-language/array-declarations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/c-language/array-declarations.md b/docs/c-language/array-declarations.md index 53409bd05e..cf593aeb02 100644 --- a/docs/c-language/array-declarations.md +++ b/docs/c-language/array-declarations.md @@ -25,7 +25,7 @@ An "array declaration" names the array and specifies the type of its elements. I *`declarator`*:\  *`pointer`*opt *`direct-declarator`* -*`direct-declarator`*: /\* A function declarator \*/\ +*`direct-declarator`*:\  *`direct-declarator`* **`[`** *`constant-expression`*opt **`]`** Because *`constant-expression`* is optional, the syntax has two forms: From bd959184a4f17a13209cb9f34621c9c5ff961cbb Mon Sep 17 00:00:00 2001 From: melody Date: Thu, 27 Jul 2023 03:38:56 +0800 Subject: [PATCH 0033/1931] docs: enhanced readability Enhanced readability with C-style markdown formatting in the documentation related to Complex Declarators. --- .../interpreting-more-complex-declarators.md | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/c-language/interpreting-more-complex-declarators.md b/docs/c-language/interpreting-more-complex-declarators.md index d780d03e13..938504a381 100644 --- a/docs/c-language/interpreting-more-complex-declarators.md +++ b/docs/c-language/interpreting-more-complex-declarators.md @@ -47,31 +47,31 @@ In this example, the steps are numbered in order and can be interpreted as follo The following examples illustrate other complex declarations and show how parentheses can affect the meaning of a declaration. -``` +```C int *var[5]; /* Array of pointers to int values */ ``` The array modifier has higher priority than the pointer modifier, so `var` is declared to be an array. The pointer modifier applies to the type of the array elements; therefore, the array elements are pointers to **`int`** values. -``` +```C int (*var)[5]; /* Pointer to array of int values */ ``` In this declaration for `var`, parentheses give the pointer modifier higher priority than the array modifier, and `var` is declared to be a pointer to an array of five **`int`** values. -``` +```C long *var( long, long ); /* Function returning pointer to long */ ``` Function modifiers also have higher priority than pointer modifiers, so this declaration for `var` declares `var` to be a function returning a pointer to a **`long`** value. The function is declared to take two **`long`** values as arguments. -``` +```C long (*var)( long, long ); /* Pointer to function returning long */ ``` This example is similar to the previous one. Parentheses give the pointer modifier higher priority than the function modifier, and `var` is declared to be a pointer to a function that returns a **`long`** value. Again, the function takes two **`long`** arguments. -``` +```C struct both /* Array of pointers to functions */ { /* returning structures */ int a; @@ -81,14 +81,14 @@ struct both /* Array of pointers to functions */ The elements of an array cannot be functions, but this declaration demonstrates how to declare an array of pointers to functions instead. In this example, `var` is declared to be an array of five pointers to functions that return structures with two members. The arguments to the functions are declared to be two structures with the same structure type, `both`. Note that the parentheses surrounding `*var[5]` are required. Without them, the declaration is an illegal attempt to declare an array of functions, as shown below: -``` +```C /* ILLEGAL */ struct both *var[5](struct both, struct both); ``` The following statement declares an array of pointers. -``` +```C unsigned int *(* const *name[5][10] ) ( void ); ``` @@ -96,13 +96,13 @@ The `name` array has 50 elements organized in a multidimensional array. The elem This next example is a function returning a pointer to an array of three **`double`** values. -``` +```C double ( *var( double (*)[3] ) )[3]; ``` In this declaration, a function returns a pointer to an array, since functions returning arrays are illegal. Here `var` is declared to be a function returning a pointer to an array of three **`double`** values. The function `var` takes one argument. The argument, like the return value, is a pointer to an array of three **`double`** values. The argument type is given by a complex *abstract-declarator*. The parentheses around the asterisk in the argument type are required; without them, the argument type would be an array of three pointers to **`double`** values. For a discussion and examples of abstract declarators, see [Abstract Declarators](../c-language/c-abstract-declarators.md). -``` +```C union sign /* Array of arrays of pointers */ { /* to pointers to unions */ int x; @@ -112,7 +112,7 @@ union sign /* Array of arrays of pointers */ As the above example shows, a pointer can point to another pointer, and an array can contain arrays as elements. Here `var` is an array of five elements. Each element is a five-element array of pointers to pointers to unions with two members. -``` +```C union sign *(*var[5])[5]; /* Array of pointers to arrays of pointers to unions */ ``` From 67b25c2f459247c457bd1ab943a380239cdef322 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 26 Jul 2023 13:50:43 -0700 Subject: [PATCH 0034/1931] add links per support request --- .../configuring-programs-for-arm-processors-visual-cpp.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/build/configuring-programs-for-arm-processors-visual-cpp.md b/docs/build/configuring-programs-for-arm-processors-visual-cpp.md index 4379cb9a7a..6038c6831e 100644 --- a/docs/build/configuring-programs-for-arm-processors-visual-cpp.md +++ b/docs/build/configuring-programs-for-arm-processors-visual-cpp.md @@ -2,7 +2,6 @@ description: "Learn more about: Configure C++ projects for ARM processors" title: "Configure C++ projects for ARM processors" ms.date: "07/11/2018" -ms.assetid: 3d95f221-656a-480d-9651-9ad263895747 --- # Configure C++ projects for ARM processors @@ -27,6 +26,12 @@ Describes the encoding scheme for stack unwinding during structured exception ha ## Related Sections +[Get started with Arm64EC](/windows/arm/arm64ec-build)\ +Describes how to get started building your app or project using [Arm64EC](/windows/arm/arm64ec). + +[How to: Configure projects to target platforms](/visualstudio/ide/how-to-configure-projects-to-target-platforms)\ +Describes how to set up your application builds to target different processor architectures, including Arm64. + [ARM intrinsics](../intrinsics/arm-intrinsics.md)\ Describes compiler intrinsics for processors that use the ARM architecture. From 2b0ea1904a406e89c2377b12ed4a599c96afa775 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 26 Jul 2023 14:01:55 -0700 Subject: [PATCH 0035/1931] acrolinx --- .../configuring-programs-for-arm-processors-visual-cpp.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/configuring-programs-for-arm-processors-visual-cpp.md b/docs/build/configuring-programs-for-arm-processors-visual-cpp.md index 6038c6831e..fc99baa1b2 100644 --- a/docs/build/configuring-programs-for-arm-processors-visual-cpp.md +++ b/docs/build/configuring-programs-for-arm-processors-visual-cpp.md @@ -16,7 +16,7 @@ Describes the application binary interface used by Windows on ARM for register u Describes the application binary interface used by Windows on ARM64 for register usage, calling conventions and exception handling. [Common MSVC ARM migration issues](common-visual-cpp-arm-migration-issues.md)\ -Describes C++ code elements that are commonly assumed to be portable across architectures, but which produce different results for ARM than for x86 and x64. +Describes C++ code elements that are commonly assumed to be portable across architectures, but that produce different results for ARM than for x86 and x64. [ARM exception handling](arm-exception-handling.md)\ Describes the encoding scheme for stack unwinding during structured exception handling in Windows on ARM. @@ -29,8 +29,8 @@ Describes the encoding scheme for stack unwinding during structured exception ha [Get started with Arm64EC](/windows/arm/arm64ec-build)\ Describes how to get started building your app or project using [Arm64EC](/windows/arm/arm64ec). -[How to: Configure projects to target platforms](/visualstudio/ide/how-to-configure-projects-to-target-platforms)\ -Describes how to set up your application builds to target different processor architectures, including Arm64. +[How to: Configure projects to target platforms](/visualstudio/ide/how-to-configure-projects-to-target-platforms)\ +Describes how to set up your build to target different processor architectures, including Arm64. [ARM intrinsics](../intrinsics/arm-intrinsics.md)\ Describes compiler intrinsics for processors that use the ARM architecture. From b6b3b7ca32669a113085e753be7b75d1e033661d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 27 Jul 2023 11:26:35 -0700 Subject: [PATCH 0036/1931] add another example --- docs/sanitizers/asan-continue-on-error.md | 146 +++++++++++++++++++--- 1 file changed, 129 insertions(+), 17 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 973c3bef3c..dc510cc37a 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,16 +1,18 @@ --- title: "Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues" description: "Learn how to use Address Sanitizer continue on error to find memory safety errors in your app." -ms.date: 07/13/2023 +ms.date: 07/27/2023 f1_keywords: ["AddressSanitizer", "Continue On Error"] helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "Continue On Error", "ASAN continue on error", "Address Sanitizer continue on error"] --- # Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues +This walkthrough shows how to create a checked build that finds and reports memory safety errors. + Memory safety errors such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) -Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or the log file of your choice. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or the log file of your choice. When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and continues to run. After your app exits, a summary of all the memory issues is provided. @@ -20,22 +22,132 @@ Afterwards, you get a summary of the memory issues. With COE, you can compile an You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -This walkthrough shows how to create a checked build that has COE enabled, and what the output looks like for code with memory safety errors. - -## Prerequisites +It's important to be aware that you shouldn't deploy a checked build with COE enabled into production. COE is not intended to be used in production. It's intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation that ASAN adds to your code to detect memory safety errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid an increased surface area for security exploits. -To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the Desktop development with C++ workload installed. +In the following examples, you'll create a checked build and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. -## Out of bounds memory access example +## Prerequisites -When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. +To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the *Desktop development with C++ workload* installed. -In this example, create a checked build and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. +## Double free example -### Create a checked build with ASAN enabled +Create a checked build with ASAN enabled to test what happens when memory is double freed. Double free is a common memory safety error. ASAN detects this error and reports it. With COE, the program continues to run after the error is detected, and a summary of the error is output to `stdout` when the program exits: 1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt, such as **Developer Command Prompt for VS 2022**, from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. +1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: + +```cpp +#include +#include + +void BadFunction(int *pointer) +{ + free(pointer); + free(pointer); // double-free! +} + +int main(int argc, const char *argv[]) +{ + int *pointer = static_cast(malloc(4)); + BadFunction(pointer); + + // Normally we'd crash before this, but with COE we can see heap-use-after-free + printf("\n\n******* Pointer value: %d\n", *pointer); + + return 1; +} +``` + +In the preceding code, `pointer` is freed twice. This is a contrived example, but double frees are an easy mistake to make in complex C++ code. + +Create a checked build of the preceding code with COE turned on: + +1. Compile the code using the `-fsanitize=address` (turns on COE), `-Zi` (creates a separate PDB file that address sanitizer uses to display memory error location information), switches: + `cl -fsanitize=address -Zi doublefree.cpp` +1. To send ASAN output to stdout, set the `ASAN_OPTIONS` environment variable: + `set ASAN_OPTIONS=continue_on_error=1` +1. Run the test code with: `doublefree.exe` + +The output shows that there was a double free error and the call stack where it happened. The report starts out like this: + +```cmd +==22976==ERROR: AddressSanitizer: attempting double-free on 0x01e03550 in thread T0: + #0 free D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp(69) + #1 BadFunction C:\Users\xxx\Desktop\COE\doublefree.cpp(8) + #2 main C:\Users\xxx\Desktop\COE\doublefree.cpp(14) + #3 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #4 BaseThreadInitThunk Windows + #5 RtlInitializeExceptionChain Windows +``` + +Next, there's information about the freed memory and a callstack for where it was allocated: + +```cmd +0x01e03550 is located 0 bytes inside of 4-byte region [0x01e03550,0x01e03554) +freed by thread T0 here: + #0 free D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp(69) + #1 BadFunction C:\Users\xxx\Desktop\COE\doublefree.cpp(7) + #2 main C:\Users\xxx\Desktop\COE\doublefree.cpp(14) + #3 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #4 BaseThreadInitThunk Windows + #5 RtlInitializeExceptionChain Windows + +previously allocated by thread T0 here: + #0 malloc D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp(85) + #1 main C:\Users\xxx\Desktop\COE\doublefree.cpp(13) + #2 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #3 BaseThreadInitThunk Windows + #4 RtlInitializeExceptionChain Windows +``` + +Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). + +Following that, you'll see the output from the program, which indicates that it continued running after ASAN detected the error: + +```cmd +******* Pointer value: xxx +``` + +Then there's a summary of the source files where the memory error happened. It's sorted in order of the unique call stacks for the memory errors in that file. What determines a unique call stack is the type of error and the call stack where the error occurred. + +The reason for this sorting is to prioritize memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: + +```cmd +=== Files in priority order === + +File: D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp Unique call stacks: 1 +File: C:\Users\xxx\Desktop\COE\doublefree.cpp Unique call stacks: 1 +`````` + +Finally, the report contains a summary of where the memory error occurred. It looks like this: + +```cmd +=== Source Code Details: Unique errors caught at instruction offset fron source line number, in functions, in the same file. === + +File: D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp + Func: free() + Line: 69 Unique call stacks (paths) leading to error at line 69 : 1 + Bug: double-free at instr 19 bytes from start of line +File: C:\Users\xxx\Desktop\COE\doublefree.cpp + Func: main() + Line: 18 Unique call stacks (paths) leading to error at line 18 : 1 + Bug: heap-use-after-free at instr 55 bytes from start of line + +>>>Total: 2 Unique Memory Safety Issues (based on call stacks not source position) <<< + +#0 C:\Users\xxx\Desktop\COE\doublefree.cpp Function: main(Line:18) + Raw HitCnt: 1 On Reference: 4-byte-read-heap-use-after-free +#1 D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp Function: free(Line:69) + Raw HitCnt: 1 +``` + +## Out of bounds memory access example + +Create a checked build with ASAN enabled to test out-of-bounds memory access: + +1. Using the developer command prompt you opened for the previous example, create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: ```cpp @@ -72,8 +184,8 @@ Errors are only observable if the following page is unmapped, or upon use of cor Create a checked build of the preceding code with COE turned on: 1. Compile the code using the `-fsanitize=address` (turns on COE) and `-Zi` (creates a separate PDB file that address sanitizer uses to display memory error location information) switches: `cl -fsanitize=address -Zi coe.cpp` -1. Set the `ASAN_OPTIONS` environment variable to send ASAN output to stdout: `set ASAN_OPTIONS=Continue On Error=1` -1. Run the test code: `coe.exe` +1. To send ASAN output to stdout, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` +1. Run the test code with: `coe.exe` The output shows that there were two memory buffer overflow errors and gives the call stack for where they happened. The report starts out like this: @@ -119,12 +231,12 @@ File: C:\Users\xxx\Desktop\COE\coe.cpp The default Address Sanitizer runtime behavior terminates the app after reporting the first error it finds. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. COE tries to automatically return control back to the application after reporting each memory safety error. There are situations when it can't, such as when there's a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that the program's structured exception handling doesn't catch. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. -### Set an environment variable to output to stdout +## Select where to send ASAN output There are different options for where the output from ASAN goes. They are: -- Output to stdout: `set ASAN_OPTIONS=Continue On Error=1` -- Output to stderr: `set ASAN_OPTIONS=Continue On Error=2` +- Output to stdout: `set ASAN_OPTIONS=continue_on_error=1` +- Output to stderr: `set ASAN_OPTIONS=continue_on_error=2` - Output to a log file of your choice: `set COE_LOG_FILE=yourfile.log` ## Handling undefined behavior @@ -191,11 +303,11 @@ void main() In `main()`, a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. -This example outputs `pass` when compiled without the `-fsanitize=address` switch because `cnt==1` because the exception code matches `RET_STACK_EXCEPTION`. However, it fails when compiled with `-fsanitize=address` because the thrown exception is an Address Sanitizer error: dynamic-stack-buffer-overflow. So the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION`. +This example outputs `pass` when compiled without the `-fsanitize=address` switch but outputs `fail` with it. That's because without the switch, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with `-fsanitize=address` because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. ## Other benefits -Earlier versions of ASAN required the `llvm_symbolizer.exe` binary. With the new ASAN runtime, this isn't necessary. This makes it even easier to use ASAN with your normal test harness because you don't have to manage extra binaries. +With the new ASAN runtime, no additional binaries need to be deployed with your app. This makes it even easier to use ASAN with your normal test harness because you don't have to manage extra binaries. ## See also From e1129f2089429866fdbd26552cdd3ace65d397ee Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 27 Jul 2023 13:36:14 -0700 Subject: [PATCH 0037/1931] tuning --- docs/sanitizers/asan-continue-on-error.md | 73 ++++++++++++----------- docs/sanitizers/toc.yml | 2 +- 2 files changed, 40 insertions(+), 35 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index dc510cc37a..c0ceaec02b 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -8,23 +8,23 @@ helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compilin # Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues -This walkthrough shows how to create a checked build that finds and reports memory safety errors. +In this walkthrough, create checked builds that find and report memory safety errors. -Memory safety errors such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md) +Memory safety errors such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md). -Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports unique memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or the log file of your choice. When you create a standard C++ checked build of your app with `-fsanitizer=address`, calls to allocators, deallocators, `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or a log file of your choice. When you create a standard C++ checked build with `-fsanitizer=address`, calls to allocators, deallocators such as `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. -A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and continues to run. After your app exits, a summary of all the memory issues is provided. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and your app continues to run. After your app exits, a summary of all the memory issues is output. -You can create a checked build for your C and C++ programs with ASAN turned on and run in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues. And without interfering with the tests. +You can create a checked build of your C or C++ app with ASAN turned on, and then run your app in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues without interfering with the tests. -Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app runs slower due to the ASAN instrumentation. +Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. -You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but this new feature reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. +You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but COE reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -It's important to be aware that you shouldn't deploy a checked build with COE enabled into production. COE is not intended to be used in production. It's intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation that ASAN adds to your code to detect memory safety errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid an increased surface area for security exploits. +It's important to be aware that you shouldn't deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation that ASAN adds to detect memory safety errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid increasing the surface area of possible security exploits. -In the following examples, you'll create a checked build and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. +In the following examples, you create checked builds and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. ## Prerequisites @@ -32,9 +32,9 @@ To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the ## Double free example -Create a checked build with ASAN enabled to test what happens when memory is double freed. Double free is a common memory safety error. ASAN detects this error and reports it. With COE, the program continues to run after the error is detected, and a summary of the error is output to `stdout` when the program exits: +Create a checked build with ASAN enabled to test what happens when memory is double freed. Double freeing memory is a common error. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, and a summary of the error is output to `stdout` when the program exits: -1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt, such as **Developer Command Prompt for VS 2022**, from the list of matches. +1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt, such as **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: @@ -60,17 +60,16 @@ int main(int argc, const char *argv[]) } ``` -In the preceding code, `pointer` is freed twice. This is a contrived example, but double frees are an easy mistake to make in complex C++ code. +In the preceding code, `pointer` is freed twice. This is a contrived example, but double frees are an easy mistake to make in more complex C++ code. Create a checked build of the preceding code with COE turned on: -1. Compile the code using the `-fsanitize=address` (turns on COE), `-Zi` (creates a separate PDB file that address sanitizer uses to display memory error location information), switches: - `cl -fsanitize=address -Zi doublefree.cpp` -1. To send ASAN output to stdout, set the `ASAN_OPTIONS` environment variable: +1. Compile the code using `cl -fsanitize=address -Zi doublefree.cpp`. The `-fsanitize=address` switch turns on COE, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. +1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `doublefree.exe` -The output shows that there was a double free error and the call stack where it happened. The report starts out like this: +The output shows that there was a double free error and the call stack where it happened. The report starts out like this with a calls stack that shows the error happened in `BadFunction`: ```cmd ==22976==ERROR: AddressSanitizer: attempting double-free on 0x01e03550 in thread T0: @@ -104,15 +103,15 @@ previously allocated by thread T0 here: Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). -Following that, you'll see the output from the program, which indicates that it continued running after ASAN detected the error: +Following the shadow byte information, you'll see the output from the program, which indicates that it continued running after ASAN detected the error: ```cmd ******* Pointer value: xxx ``` -Then there's a summary of the source files where the memory error happened. It's sorted in order of the unique call stacks for the memory errors in that file. What determines a unique call stack is the type of error and the call stack where the error occurred. +Then there's a summary of the source files where the memory error happened. It's sorted in order of the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. -The reason for this sorting is to prioritize memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: +This sorting prioritizes memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: ```cmd === Files in priority order === @@ -145,9 +144,9 @@ File: C:\Users\xxx\Desktop\COE\doublefree.cpp ## Out of bounds memory access example -Create a checked build with ASAN enabled to test out-of-bounds memory access: +For the next example, create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds: -1. Using the developer command prompt you opened for the previous example, create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. +1. Using the developer command prompt you opened for the previous example, create a directory on your machine to run this example such as `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: ```cpp @@ -177,17 +176,17 @@ In the preceding code, the parameter `sz` is 10 and the original buffer is 10 by - an out-of-bounds load from `buf` in the `for` loop - an out-of-bounds store to `local` in the `for` loop -The buffer overflow is due to the loop exit test `<=sz`. When this example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop," which is due to the C Runtime (CRT) padding allocations out to a 0 mod 16 aggregate boundary. +The buffer overflow is due to the loop exit test `<=sz`. When this example runs, it's *secure by coincidence*. That's because of the over-allocation and alignment done by most C++ runtime implementations. When `sz % 16 == 0`, the final write to `local[ii]` corrupts memory. Other cases only read/write to the "malloc slop," which is extra memory allocated due to the way the C Runtime (CRT) pads allocations to a 0 mod 16 boundary. -Errors are only observable if the following page is unmapped, or upon use of corrupted data. All other cases are silent in this example. With Continue On Error, you see both errors in the summary after the program runs to completion. +Errors are only observable if the page following the allocation is unmapped, or upon use of corrupted data. All other cases are silent in this example. With Continue On Error, the errors are made visible in the summary after the program runs to completion. Create a checked build of the preceding code with COE turned on: -1. Compile the code using the `-fsanitize=address` (turns on COE) and `-Zi` (creates a separate PDB file that address sanitizer uses to display memory error location information) switches: `cl -fsanitize=address -Zi coe.cpp` -1. To send ASAN output to stdout, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` +1. Compile the code with `cl -fsanitize=address -Zi coe.cpp`. The `-fsanitize=address` switch turns on COE, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. +1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `coe.exe` -The output shows that there were two memory buffer overflow errors and gives the call stack for where they happened. The report starts out like this: +The output shows that there were two memory buffer overflow errors and provides the call stack for where they happened. The report starts out like this: ```cmd ==9776==ERROR: AddressSanitizer: global-buffer-overflow on address 0x0047b08a at pc 0x003c121b bp 0x012ffaec sp 0x012ffae0 @@ -201,9 +200,11 @@ READ of size 1 at 0x0047b08a thread T0 Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). -Then there's a summary of the source files where the memory errors happened. It's sorted in order of the unique call stacks for the memory errors in that file. What determines a unique call stack is the type of error and the call stack where the error occurred. +Following the shadow byte report, there's a summary of the source files where the memory errors happened. It's sorted in order of the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. -The reason for this sorting is to prioritize memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: +This sorting prioritizes memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. + +The summary looks like this: ```cmd === Files in priority order === @@ -211,7 +212,9 @@ The reason for this sorting is to prioritize memory safety issues that may be th File: C:\Users\xxx\Desktop\COE\coe.cpp Unique call stacks: 2 ``` -Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. It looks like this: +Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. + +The report looks like this: ```cmd === Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === @@ -229,11 +232,13 @@ File: C:\Users\xxx\Desktop\COE\coe.cpp Raw HitCnt: 1 On Reference: 1-byte-write-heap-buffer-overflow ``` -The default Address Sanitizer runtime behavior terminates the app after reporting the first error it finds. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. COE tries to automatically return control back to the application after reporting each memory safety error. There are situations when it can't, such as when there's a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that the program's structured exception handling doesn't catch. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. +The default Address Sanitizer runtime behavior terminates the app after reporting the first error it finds. It doesn't allow the "bad" machine instruction to execute. The new Address Sanitizer runtime diagnoses and reports errors, but then executes subsequent instructions. + +COE tries to automatically return control back to the application after reporting each memory safety error. There are situations when it can't, such as when there's a memory access violation (AV) or a failed memory allocation. COE doesn't continue after access violations that the program's structured exception handling doesn't catch. If COE can't return execution to the app, a `CONTINUE CANCELLED - Deadly Signal. Shutting down.` message is output. ## Select where to send ASAN output -There are different options for where the output from ASAN goes. They are: +There are different options for where to send ASAN output. They are: - Output to stdout: `set ASAN_OPTIONS=continue_on_error=1` - Output to stderr: `set ASAN_OPTIONS=continue_on_error=2` @@ -241,7 +246,7 @@ There are different options for where the output from ASAN goes. They are: ## Handling undefined behavior -The ASAN runtime doesn't mimic all of the undefined behaviors for C and C++. The following example demonstrates an example where code generation from the compiler and the runtime implementation differs for **_alloca**: +The ASAN runtime doesn't mimic all of the undefined behaviors of the C and C++ allocation/deallocation functions. The following example demonstrates where behavior differs for **_alloca**: ```cpp #include @@ -303,11 +308,11 @@ void main() In `main()`, a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. -This example outputs `pass` when compiled without the `-fsanitize=address` switch but outputs `fail` with it. That's because without the switch, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with `-fsanitize=address` because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. +This example outputs `pass` when compiled without ASAN (that is, no `-fsanitize=address` switch) but outputs `fail` when compiled with ASAN turned on. That's because without ASAN, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with ASAN on because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. ## Other benefits -With the new ASAN runtime, no additional binaries need to be deployed with your app. This makes it even easier to use ASAN with your normal test harness because you don't have to manage extra binaries. +With the new ASAN runtime, no extra binaries need to be deployed with your app. This makes it even easier to use ASAN with your normal test harness because you don't have to manage extra binaries. ## See also diff --git a/docs/sanitizers/toc.yml b/docs/sanitizers/toc.yml index a40e180696..96ec14bf18 100644 --- a/docs/sanitizers/toc.yml +++ b/docs/sanitizers/toc.yml @@ -6,7 +6,7 @@ items: items: - name: "AddressSanitizer overview" href: ../sanitizers/asan.md - - name: Continue on error feature + - name: Continue on error walkthrough href: ../sanitizers/asan-continue-on-error.md - name: "Build and language reference" href: ../sanitizers/asan-building.md From 9e0875b88d1128b9fc76c4a27dc971278a05ec2b Mon Sep 17 00:00:00 2001 From: mspll <109390104+mspll@users.noreply.github.com> Date: Thu, 27 Jul 2023 13:37:25 -0700 Subject: [PATCH 0038/1931] largeaddressaware:no is not recommended for 64-bit apps --- .../build/reference/largeaddressaware-handle-large-addresses.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/build/reference/largeaddressaware-handle-large-addresses.md b/docs/build/reference/largeaddressaware-handle-large-addresses.md index e63c9bf10e..7e0e15c9a2 100644 --- a/docs/build/reference/largeaddressaware-handle-large-addresses.md +++ b/docs/build/reference/largeaddressaware-handle-large-addresses.md @@ -18,6 +18,8 @@ The /LARGEADDRESSAWARE option tells the linker that the application can handle a If an application was linked with /LARGEADDRESSAWARE, DUMPBIN [/HEADERS](headers.md) will display information to that effect. +Linking 64-bit applications with **`/LARGEADDRESSAWARE:NO`** is not recommended because it severely restricts the amount of available address space and can result in runtime failures. + ### To set this linker option in the Visual Studio development environment 1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). From 6f53222112208cfdde5c46013dce5d05815489e9 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Fri, 28 Jul 2023 11:35:28 -0700 Subject: [PATCH 0039/1931] Learn Editor: Update connection-maps.md --- docs/mfc/reference/connection-maps.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/docs/mfc/reference/connection-maps.md b/docs/mfc/reference/connection-maps.md index dda5d5f1d1..271abaa8ce 100644 --- a/docs/mfc/reference/connection-maps.md +++ b/docs/mfc/reference/connection-maps.md @@ -5,6 +5,7 @@ ms.date: "11/04/2016" helpviewer_keywords: ["connection maps"] ms.assetid: 1f25a9bc-6d09-4614-99cf-dc38e8ddfa73 --- + # Connection Maps OLE controls are able to expose interfaces to other applications. These interfaces only allow access from a container into that control. If an OLE control wants to access external interfaces of other OLE objects, a connection point must be established. This connection point allows a control outgoing access to external dispatch maps, such as event maps or notification functions. @@ -207,10 +208,18 @@ A pointer to the object that implements the interface. *iid*
The interface ID of the connection. -*bRefCount*
-TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. FALSE indicates that the reference count should not be incremented. +*bRefCount* + +For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. + +For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. FALSE indicates that the reference count should not be incremented. + +**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. + +*pdwCookie.* + +This is a deprecated parameter that must now be set to TRUE
-*pdwCookie*
A pointer to a DWORD where a connection identifier is returned. This value should be passed as the *dwCookie* parameter to `AfxConnectionUnadvise` when disconnecting the connection. ### Return Value @@ -250,9 +259,15 @@ A pointer to the object that implements the interface. The interface ID of the connection point interface. *bRefCount*
-TRUE indicates that disconnecting the connection should cause the reference count of *pUnkSink* to be decremented. FALSE indicates that the reference count should not be decremented. + +For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. + +For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. FALSE indicates that the reference count should not be decremented. + +**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. *dwCookie*
+ The connection identifier returned by `AfxConnectionAdvise`. ### Return Value @@ -270,3 +285,4 @@ Nonzero if a connection was disconnected; otherwise 0. ## See also [Macros and Globals](../../mfc/reference/mfc-macros-and-globals.md) + From 2c0f5a62d51c688f87c4e2fbb99156c85f7de345 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Fri, 28 Jul 2023 11:46:49 -0700 Subject: [PATCH 0040/1931] Learn Editor: Update connection-maps.md From 964974aa1801dec75cd5be990f76e9a0a727c1f9 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Fri, 28 Jul 2023 11:47:55 -0700 Subject: [PATCH 0041/1931] Learn Editor: Update connection-maps.md --- docs/mfc/reference/connection-maps.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/mfc/reference/connection-maps.md b/docs/mfc/reference/connection-maps.md index 271abaa8ce..541e022b07 100644 --- a/docs/mfc/reference/connection-maps.md +++ b/docs/mfc/reference/connection-maps.md @@ -218,8 +218,6 @@ For in-process connections, TRUE indicates that creating the connection should c *pdwCookie.* -This is a deprecated parameter that must now be set to TRUE
- A pointer to a DWORD where a connection identifier is returned. This value should be passed as the *dwCookie* parameter to `AfxConnectionUnadvise` when disconnecting the connection. ### Return Value From 0ec0e34cea73bb6a3cc902ee341a6cbb1f557f78 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 14:05:39 -0700 Subject: [PATCH 0042/1931] add description for using heap after free in the doublefree example --- docs/sanitizers/asan-continue-on-error.md | 34 ++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index c0ceaec02b..cb71afb9cd 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -64,7 +64,7 @@ In the preceding code, `pointer` is freed twice. This is a contrived example, bu Create a checked build of the preceding code with COE turned on: -1. Compile the code using `cl -fsanitize=address -Zi doublefree.cpp`. The `-fsanitize=address` switch turns on COE, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. +1. Compile the code using `cl -fsanitize=address -Zi doublefree.cpp`. The `-fsanitize=address` switch turns on ASAN, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. 1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `doublefree.exe` @@ -81,7 +81,7 @@ The output shows that there was a double free error and the call stack where it #5 RtlInitializeExceptionChain Windows ``` -Next, there's information about the freed memory and a callstack for where it was allocated: +Next, there's information about the freed memory and a call stack for where it was allocated: ```cmd 0x01e03550 is located 0 bytes inside of 4-byte region [0x01e03550,0x01e03554) @@ -101,6 +101,32 @@ previously allocated by thread T0 here: #4 RtlInitializeExceptionChain Windows ``` +Then there's information about the heap-use-after-free error. That refers to using `*pointer` in the `printf()` call because the memory `pointer` refers to was freed earlier. The call stack where the error occurs is listed, as is the call stack where this memory was allocated and freed: + +```cmd +==35680==ERROR: AddressSanitizer: heap-use-after-free on address 0x02a03550 at pc 0x00e91097 bp 0x012ffc64 sp 0x012ffc58READ of size 4 at 0x02a03550 thread T0 + #0 main C:\Users\xxx\Desktop\Projects\ASAN\doublefree.cpp(18) + #1 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #2 BaseThreadInitThunk Windows + #3 RtlInitializeExceptionChain Windows + +0x02a03550 is located 0 bytes inside of 4-byte region [0x02a03550,0x02a03554) +freed by thread T0 here: + #0 free D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp(69) + #1 BadFunction C:\Users\xxx\Desktop\Projects\ASAN\doublefree.cpp(7) + #2 main C:\Users\xxx\Desktop\Projects\ASAN\doublefree.cpp(14) + #3 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #4 BaseThreadInitThunk Windows + #5 RtlInitializeExceptionChain Windows + +previously allocated by thread T0 here: + #0 malloc D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp(85) + #1 main C:\Users\xxx\Desktop\Projects\ASAN\doublefree.cpp(13) + #2 __scrt_common_main_seh D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl(288) + #3 BaseThreadInitThunk Windows + #4 RtlInitializeExceptionChain Windows +``` + Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). Following the shadow byte information, you'll see the output from the program, which indicates that it continued running after ASAN detected the error: @@ -120,10 +146,10 @@ File: D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_ File: C:\Users\xxx\Desktop\COE\doublefree.cpp Unique call stacks: 1 `````` -Finally, the report contains a summary of where the memory error occurred. It looks like this: +Finally, the report contains a summary of where the memory errors occurred. It looks like this: ```cmd -=== Source Code Details: Unique errors caught at instruction offset fron source line number, in functions, in the same file. === +=== Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === File: D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_thunk.cpp Func: free() From d117248c21167e86e3a022bde3d09c8b770bdca4 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 14:48:20 -0700 Subject: [PATCH 0043/1931] wordsmith --- docs/sanitizers/asan-continue-on-error.md | 43 ++++++++++++----------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index cb71afb9cd..09a32f7b18 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,7 +1,7 @@ --- title: "Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues" description: "Learn how to use Address Sanitizer continue on error to find memory safety errors in your app." -ms.date: 07/27/2023 +ms.date: 07/28/2023 f1_keywords: ["AddressSanitizer", "Continue On Error"] helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "Continue On Error", "ASAN continue on error", "Address Sanitizer continue on error"] --- @@ -10,19 +10,19 @@ helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compilin In this walkthrough, create checked builds that find and report memory safety errors. -Memory safety errors such as out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes hard-to-find bugs of this kind, and with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md). +Memory safety errors like out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes these kinds of hard-to-find bugs, and does it with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md). -Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or a log file of your choice. When you create a standard C++ checked build with `-fsanitizer=address`, calls to allocators, deallocators such as `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but also monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or a log file of your choice. When you create a standard C++ checked build with `-fsanitizer=address`, calls to allocators, deallocators such as `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and your app continues to run. After your app exits, a summary of all the memory issues is output. -You can create a checked build of your C or C++ app with ASAN turned on, and then run your app in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues without interfering with the tests. +It's a good practice to create a checked build of your C or C++ app with ASAN turned on, and then run your app in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues--without interfering with the tests. -Afterwards, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. +When your app finishes, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but COE reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -It's important to be aware that you shouldn't deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation that ASAN adds to detect memory safety errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid increasing the surface area of possible security exploits. +It's important not to deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production. That's because of the performance impact of the instrumentation added to detect memory errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid increasing the surface area of possible security exploits. In the following examples, you create checked builds and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. @@ -32,9 +32,9 @@ To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the ## Double free example -Create a checked build with ASAN enabled to test what happens when memory is double freed. Double freeing memory is a common error. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, and a summary of the error is output to `stdout` when the program exits: +In this example, you create a checked build with ASAN enabled to test what happens when memory is double freed. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, which leads to a second error--using memory that's been freed. A summary of the errors is output to `stdout` when the program exits: -1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt, such as **Developer Command Prompt for VS 2022** from the list of matches. +1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: @@ -53,7 +53,7 @@ int main(int argc, const char *argv[]) int *pointer = static_cast(malloc(4)); BadFunction(pointer); - // Normally we'd crash before this, but with COE we can see heap-use-after-free + // Normally we'd crash before this, but with COE we can see heap-use-after-free error as well printf("\n\n******* Pointer value: %d\n", *pointer); return 1; @@ -69,7 +69,7 @@ Create a checked build of the preceding code with COE turned on: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `doublefree.exe` -The output shows that there was a double free error and the call stack where it happened. The report starts out like this with a calls stack that shows the error happened in `BadFunction`: +The output shows that there was a double free error and the call stack where it happened. The report starts out with a call stack that shows the error happened in `BadFunction`: ```cmd ==22976==ERROR: AddressSanitizer: attempting double-free on 0x01e03550 in thread T0: @@ -81,7 +81,7 @@ The output shows that there was a double free error and the call stack where it #5 RtlInitializeExceptionChain Windows ``` -Next, there's information about the freed memory and a call stack for where it was allocated: +Next, there's information about the freed memory and a call stack for where the memory was allocated: ```cmd 0x01e03550 is located 0 bytes inside of 4-byte region [0x01e03550,0x01e03554) @@ -101,7 +101,7 @@ previously allocated by thread T0 here: #4 RtlInitializeExceptionChain Windows ``` -Then there's information about the heap-use-after-free error. That refers to using `*pointer` in the `printf()` call because the memory `pointer` refers to was freed earlier. The call stack where the error occurs is listed, as is the call stack where this memory was allocated and freed: +Then there's information about the heap-use-after-free error. This refers to using `*pointer` in the `printf()` call because the memory `pointer` refers to was freed earlier. The call stack where the error occurs is listed, as are the call stacks where this memory was allocated and freed: ```cmd ==35680==ERROR: AddressSanitizer: heap-use-after-free on address 0x02a03550 at pc 0x00e91097 bp 0x012ffc64 sp 0x012ffc58READ of size 4 at 0x02a03550 thread T0 @@ -135,7 +135,7 @@ Following the shadow byte information, you'll see the output from the program, w ******* Pointer value: xxx ``` -Then there's a summary of the source files where the memory error happened. It's sorted in order of the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. +Then there's a summary of the source files where the memory error happened. It's sorted by the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. This sorting prioritizes memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. The summary looks like this: @@ -170,9 +170,10 @@ File: C:\Users\xxx\Desktop\COE\doublefree.cpp ## Out of bounds memory access example -For the next example, create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds: +In this example, you create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds. ASAN detects this error and reports a summary of the errors to `stdout` when the program exits: -1. Using the developer command prompt you opened for the previous example, create a directory on your machine to run this example such as `%USERPROFILE%\Desktop\COE`. +1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. +1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: ```cpp @@ -208,7 +209,7 @@ Errors are only observable if the page following the allocation is unmapped, or Create a checked build of the preceding code with COE turned on: -1. Compile the code with `cl -fsanitize=address -Zi coe.cpp`. The `-fsanitize=address` switch turns on COE, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. +1. Compile the code with `cl -fsanitize=address -Zi coe.cpp`. The `-fsanitize=address` switch turns on ASAN, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. 1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `coe.exe` @@ -226,7 +227,7 @@ READ of size 1 at 0x0047b08a thread T0 Next, there's information about the shadow bytes in the vicinity of the buffer overflow. For more information about shadow bytes, see [AddressSanitizer shadow bytes](asan-shadow-bytes.md). -Following the shadow byte report, there's a summary of the source files where the memory errors happened. It's sorted in order of the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. +Following the shadow byte report, there's a summary of the source files where the memory errors happened. It's sorted by the unique call stacks for the memory errors in that file. A unique call stack is determined by the type of error and the call stack where the error occurred. This sorting prioritizes memory safety issues that may be the most concerning. For example, five unique call stacks leading to different memory safety errors in the same file is potentially more worrisome than one error that hits many times. @@ -238,7 +239,7 @@ The summary looks like this: File: C:\Users\xxx\Desktop\COE\coe.cpp Unique call stacks: 2 ``` -Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. +Finally, the report contains a summary of where the memory errors occurred. Continue On Error reports two distinct errors that occur on the same source line. The first error reads memory at a global address in the `.data` section, and the other writes to memory allocated from the heap. The report looks like this: @@ -264,7 +265,7 @@ COE tries to automatically return control back to the application after reportin ## Select where to send ASAN output -There are different options for where to send ASAN output. They are: +Use the `ASAN_OPTIONS` environment variable to determine where to send ASAN output as follows: - Output to stdout: `set ASAN_OPTIONS=continue_on_error=1` - Output to stderr: `set ASAN_OPTIONS=continue_on_error=2` @@ -272,7 +273,7 @@ There are different options for where to send ASAN output. They are: ## Handling undefined behavior -The ASAN runtime doesn't mimic all of the undefined behaviors of the C and C++ allocation/deallocation functions. The following example demonstrates where behavior differs for **_alloca**: +The ASAN runtime doesn't mimic all of the undefined behaviors of the C and C++ allocation/deallocation functions. The following example demonstrates how the ASAN version **_alloca** differs from the C runtime version: ```cpp #include @@ -294,7 +295,7 @@ int foo_redundant(unsigned long arg_var) { if ((arg_var+3) > arg_var) { - // Call to alloca using parameter from main + // Call to _alloca using parameter from main a = (char *) _alloca(arg_var); memset(a, 0, 10); } From 2c4d04885be6182da27a75d091fcb2021ea862dd Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 14:53:56 -0700 Subject: [PATCH 0044/1931] wordsmith --- docs/sanitizers/asan-continue-on-error.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 09a32f7b18..935361d857 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -22,7 +22,7 @@ When your app finishes, you get a summary of the memory issues. With COE, you ca You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but COE reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -It's important not to deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production. That's because of the performance impact of the instrumentation added to detect memory errors, the risk of exposing the internal implementation if errors are reported, and because the implementation of the library functions that ASAN substitutes for memory allocation, freeing, etc. should not be used in production to avoid increasing the surface area of possible security exploits. +It's important not to deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation added to detect memory errors, the risk of exposing the internal implementation if errors are reported, and to avoid increasing the surface area of possible security exploits by shipping the library functions that ASAN substitutes for memory allocation, freeing, and so on. In the following examples, you create checked builds and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. From 3bd13dff5aebcc22325ab737ed97538501a11a01 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 15:04:10 -0700 Subject: [PATCH 0045/1931] adjust formatting of code --- docs/sanitizers/asan-continue-on-error.md | 90 +++++++++++------------ 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 935361d857..8a5587f26c 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -38,27 +38,27 @@ In this example, you create a checked build with ASAN enabled to test what happe 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: -```cpp -#include -#include - -void BadFunction(int *pointer) -{ - free(pointer); - free(pointer); // double-free! -} - -int main(int argc, const char *argv[]) -{ - int *pointer = static_cast(malloc(4)); - BadFunction(pointer); - - // Normally we'd crash before this, but with COE we can see heap-use-after-free error as well - printf("\n\n******* Pointer value: %d\n", *pointer); - - return 1; -} -``` + ```cpp + #include + #include + + void BadFunction(int *pointer) + { + free(pointer); + free(pointer); // double-free! + } + + int main(int argc, const char *argv[]) + { + int *pointer = static_cast(malloc(4)); + BadFunction(pointer); + + // Normally we'd crash before this, but with COE we can see heap-use-after-free error as well + printf("\n\n******* Pointer value: %d\n", *pointer); + + return 1; + } + ``` In the preceding code, `pointer` is freed twice. This is a contrived example, but double frees are an easy mistake to make in more complex C++ code. @@ -176,27 +176,27 @@ In this example, you create a checked build with ASAN enabled to test what happe 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `coe.cpp`, and paste the following code: -```cpp -#include - -char* func(char* buf, size_t sz) -{ - char* local = (char*)malloc(sz); - for (auto ii = 0; ii <= sz; ii++) // bad loop exit test - { - local[ii] = ~buf[ii]; // Two memory safety errors + ```cpp + #include + + char* func(char* buf, size_t sz) + { + char* local = (char*)malloc(sz); + for (auto ii = 0; ii <= sz; ii++) // bad loop exit test + { + local[ii] = ~buf[ii]; // Two memory safety errors + } + + return local; + } + + char buffer[10] = {0,1,2,3,4,5,6,7,8,9}; + + void main() + { + char* inverted_buf= func(buffer, 10); } - - return local; -} - -char buffer[10] = {0,1,2,3,4,5,6,7,8,9}; - -void main() -{ - char* inverted_buf= func(buffer, 10); -} -``` + ``` In the preceding code, the parameter `sz` is 10 and the original buffer is 10 bytes. There are two memory safety errors: @@ -335,7 +335,7 @@ void main() In `main()`, a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. -This example outputs `pass` when compiled without ASAN (that is, no `-fsanitize=address` switch) but outputs `fail` when compiled with ASAN turned on. That's because without ASAN, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with ASAN on because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. +This example outputs `pass` when compiled without ASAN (that is, no `-fsanitize=address` switch) but outputs `fail` when compiled with ASAN turned on (that is, with the `-fsanitize=address` switch). That's because without ASAN, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with ASAN on because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. ## Other benefits @@ -345,6 +345,6 @@ With the new ASAN runtime, no extra binaries need to be deployed with your app. [AddressSanitizer Continue on Error blog post](https://devblogs.microsoft.com/cppblog/addresssanitizer-continue_on_error)\ [Example memory safety errors](asan.md#error-types)\ -[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html)\ -[-Zi](../build/reference/z7-zi-zi-debug-information-format.md#zi)\ -[-fsanitize=address](../build/reference/fsanitize.md) \ No newline at end of file +[-Zi compiler flag](../build/reference/z7-zi-zi-debug-information-format.md#zi)\ +[-fsanitize=address compiler flag](../build/reference/fsanitize.md) +[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html)\ \ No newline at end of file From 1a6b8e6170fa985035ab4f65141098536797c09d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 15:10:42 -0700 Subject: [PATCH 0046/1931] another try at the formatting --- docs/sanitizers/asan-continue-on-error.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 8a5587f26c..35c73bf80b 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -32,12 +32,13 @@ To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the ## Double free example -In this example, you create a checked build with ASAN enabled to test what happens when memory is double freed. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, which leads to a second error--using memory that's been freed. A summary of the errors is output to `stdout` when the program exits: +In this example, you create a checked build with ASAN enabled to test what happens when memory is double freed. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, which leads to a second error--using memory that's been freed. A summary of the errors is output to `stdout` when the program exits. + +Create the example: 1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. 1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: - ```cpp #include #include @@ -170,7 +171,9 @@ File: C:\Users\xxx\Desktop\COE\doublefree.cpp ## Out of bounds memory access example -In this example, you create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds. ASAN detects this error and reports a summary of the errors to `stdout` when the program exits: +In this example, you create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds. ASAN detects this error and reports a summary of the errors to `stdout` when the program exits. + +Create the example: 1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. From dc46d6f2b8ee421401d0042e6ad18039d315d4a6 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 16:18:36 -0700 Subject: [PATCH 0047/1931] github fixes --- ...roperties-without-changing-project-file.md | 24 +++++++++---------- docs/cpp/modules-cpp.md | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/build/modify-project-properties-without-changing-project-file.md b/docs/build/modify-project-properties-without-changing-project-file.md index 55a167526f..aebbc2c0f7 100644 --- a/docs/build/modify-project-properties-without-changing-project-file.md +++ b/docs/build/modify-project-properties-without-changing-project-file.md @@ -1,7 +1,7 @@ --- description: "Learn more about: How to: Modify C++ project properties and targets without changing the project file" title: "How to: Modify C++ project properties and targets without changing the project file" -ms.date: "11/28/2018" +ms.date: "7/28/2023" helpviewer_keywords: ["project properties [C++], modifying outside project file"] --- # How to: Modify C++ project properties and targets without changing the project file @@ -13,27 +13,27 @@ You can override project properties and targets from the MSBuild command prompt *To override project properties:* -1. Create a .props file that specifies the properties you want to override. +1. Create a `.props` file that specifies the properties you want to override. -1. From the command prompt: set ForceImportBeforeCppTargets="C:\sources\my_props.props" +1. From the command prompt: `set ForceImportBeforeCppTargets="C:\sources\my_props.props"` *To override project targets:* -1. Create a .targets file with their implementation or a particular target +1. Create a `.targets` file with their implementation or a particular target -2. From the command prompt: set ForceImportAfterCppTargets ="C:\sources\my_target.targets" +2. From the command prompt: `set ForceImportAfterCppTargets ="C:\sources\my_target.targets"` -You can also set either option on the msbuild command line by using the /p: option: +You can also set either option on the msbuild command line by using the `/p:` option: ```cmd -> msbuild myproject.sln /p:ForceImportBeforeCppTargets="C:\sources\my_props.props" -> msbuild myproject.sln /p:ForceImportAfterCppTargets="C:\sources\my_target.targets" +msbuild myproject.sln /p:ForceImportBeforeCppTargets="C:\sources\my_props.props" +msbuild myproject.sln /p:ForceImportAfterCppTargets="C:\sources\my_target.targets" ``` -Overriding properties and targets in this way is equivalent to adding the following imports to all .vcxproj files in the solution: +Overriding properties and targets in this way is equivalent to adding the following imports to all `.vcxproj` files in the solution: -```cmd - +```xml + - + ``` diff --git a/docs/cpp/modules-cpp.md b/docs/cpp/modules-cpp.md index 822e7ad751..a70024c249 100644 --- a/docs/cpp/modules-cpp.md +++ b/docs/cpp/modules-cpp.md @@ -6,7 +6,7 @@ description: Modules in C++20 provide a modern alternative to header files. --- # Overview of modules in C++ -C++20 introduces *modules*, a modern solution that turns C++ libraries and programs into components. A *module* is a set of source code files that are compiled independently of the source files (or more precisely, the [translation units](https://wikipedia.org/wiki/Translation_unit_(programming)) that import them. Modules eliminate or reduce many of the problems associated with the use of header files. They often reduce compilation times. Macros, preprocessor directives, and non-exported names declared in a module aren't visible outside the module. They have no effect on the compilation of the translation unit that imports the module. You can import modules in any order without concern for macro redefinitions. Declarations in the importing translation unit don't participate in overload resolution or name lookup in the imported module. After a module is compiled once, the results are stored in a binary file that describes all the exported types, functions, and templates. The compiler can process that file much faster than a header file. And, the compiler can reuse it every place where the module is imported in a project. +C++20 introduces *modules*, a modern solution that turns C++ libraries and programs into components. A *module* is a set of source code files that are compiled independently of the source files (or more precisely, the [translation units](https://wikipedia.org/wiki/Translation_unit_(programming)) that import them). Modules eliminate or reduce many of the problems associated with the use of header files. They often reduce compilation times. Macros, preprocessor directives, and non-exported names declared in a module aren't visible outside the module. They have no effect on the compilation of the translation unit that imports the module. You can import modules in any order without concern for macro redefinitions. Declarations in the importing translation unit don't participate in overload resolution or name lookup in the imported module. After a module is compiled once, the results are stored in a binary file that describes all the exported types, functions, and templates. The compiler can process that file much faster than a header file. And, the compiler can reuse it every place where the module is imported in a project. You can use modules side by side with header files. A C++ source file can `import` modules and also `#include` header files. In some cases, you can import a header file as a module, which is faster than using `#include` to process it with the preprocessor. We recommend that you use modules in new projects rather than header files as much as possible. For larger existing projects under active development, experiment with converting legacy headers to modules. Base your adoption on whether you get a meaningful reduction in compilation times. From 98c172ca65d272c9877688e9e6ad16a32406b564 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 28 Jul 2023 16:23:43 -0700 Subject: [PATCH 0048/1931] acrolinx --- docs/cpp/modules-cpp.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/cpp/modules-cpp.md b/docs/cpp/modules-cpp.md index a70024c249..0a42674138 100644 --- a/docs/cpp/modules-cpp.md +++ b/docs/cpp/modules-cpp.md @@ -6,7 +6,7 @@ description: Modules in C++20 provide a modern alternative to header files. --- # Overview of modules in C++ -C++20 introduces *modules*, a modern solution that turns C++ libraries and programs into components. A *module* is a set of source code files that are compiled independently of the source files (or more precisely, the [translation units](https://wikipedia.org/wiki/Translation_unit_(programming)) that import them). Modules eliminate or reduce many of the problems associated with the use of header files. They often reduce compilation times. Macros, preprocessor directives, and non-exported names declared in a module aren't visible outside the module. They have no effect on the compilation of the translation unit that imports the module. You can import modules in any order without concern for macro redefinitions. Declarations in the importing translation unit don't participate in overload resolution or name lookup in the imported module. After a module is compiled once, the results are stored in a binary file that describes all the exported types, functions, and templates. The compiler can process that file much faster than a header file. And, the compiler can reuse it every place where the module is imported in a project. +C++20 introduces *modules*, a modern solution that turns C++ libraries and programs into components. A *module* is a set of source code files that are compiled independently of the source files (or more precisely, the [translation units](https://wikipedia.org/wiki/Translation_unit_(programming)) that import them). Modules eliminate or reduce many of the problems associated with the use of header files. They often reduce compilation times. Macros, preprocessor directives, and nonexported names declared in a module aren't visible outside the module. They have no effect on the compilation of the translation unit that imports the module. You can import modules in any order without concern for macro redefinitions. Declarations in the importing translation unit don't participate in overload resolution or name lookup in the imported module. After a module is compiled once, the results are stored in a binary file that describes all the exported types, functions, and templates. The compiler can process that file much faster than a header file. And, the compiler can reuse it every place where the module is imported in a project. You can use modules side by side with header files. A C++ source file can `import` modules and also `#include` header files. In some cases, you can import a header file as a module, which is faster than using `#include` to process it with the preprocessor. We recommend that you use modules in new projects rather than header files as much as possible. For larger existing projects under active development, experiment with converting legacy headers to modules. Base your adoption on whether you get a meaningful reduction in compilation times. @@ -16,7 +16,7 @@ To contrast modules with other ways to import the standard library, see [Compare As of Visual Studio 2022 version 17.1, C++20 standard modules are fully implemented in the Microsoft C++ compiler. -Before it was specified by the C++20 standard, Microsoft had experimental support for modules. The compiler also supported importing pre-built Standard Library modules, described below. +Before it was specified by the C++20 standard, Microsoft had experimental support for modules. The compiler also supported importing prebuilt Standard Library modules, described below. Starting with Visual Studio 2022 version 17.5, importing the Standard Library as a module is both standardized and fully implemented in the Microsoft C++ compiler. This section describes the older, experimental method, which is still supported. For information about the new standardized way to import the Standard Library using modules, see [Import the C++ standard library using modules](tutorial-import-stl-named-module.md). @@ -129,7 +129,7 @@ The **`export`** keyword is used in interface files only. An implementation file ## Modules, namespaces, and argument-dependent lookup -The rules for namespaces in modules are the same as in any other code. If a declaration within a namespace is exported, the enclosing namespace (excluding non-exported members) is also implicitly exported. If a namespace is explicitly exported, all declarations within that namespace definition are exported. +The rules for namespaces in modules are the same as in any other code. If a declaration within a namespace is exported, the enclosing namespace (excluding nonexported members) is also implicitly exported. If a namespace is explicitly exported, all declarations within that namespace definition are exported. When it does argument-dependent lookup for overload resolutions in the importing translation unit, the compiler considers functions declared in the same translation unit (including module interfaces) as where the type of the function's arguments are defined. From 32bc0feb26665be654728d3c4fbf82344f4a05a2 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Mon, 31 Jul 2023 12:01:46 -0700 Subject: [PATCH 0049/1931] Fix acrolinx and formatting --- docs/mfc/reference/connection-maps.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/mfc/reference/connection-maps.md b/docs/mfc/reference/connection-maps.md index 541e022b07..2696f0b103 100644 --- a/docs/mfc/reference/connection-maps.md +++ b/docs/mfc/reference/connection-maps.md @@ -12,7 +12,7 @@ OLE controls are able to expose interfaces to other applications. These interfac The Microsoft Foundation Class Library offers a programming model that supports connection points. In this model, "connection maps" are used to designate interfaces or connection points for the OLE control. Connection maps contain one macro for each connection point. For more information on connection maps, see the [CConnectionPoint](../../mfc/reference/cconnectionpoint-class.md) class. -Typically, a control will support just two connection points: one for events and one for property notifications. These are implemented by the `COleControl` base class and require no additional work by the control writer. Any additional connection points you want to implement in your class must be added manually. To support connection maps and points, MFC provides the following macros: +Typically, a control supports just two connection points: one for events and one for property notifications. These are implemented by the `COleControl` base class and require no extra work by the control writer. Any other connection points you want to implement in your class must be added manually. To support connection maps and points, MFC provides the following macros: ### Connection Map Declaration and Demarcation @@ -53,7 +53,7 @@ Specifies the name of the local class that implements the connection point. ### Remarks -In the declaration (.h) file that defines the member functions for your class, start the connection point with the BEGIN_CONNECTION_PART macro, then add the CONNECTION_IID macro and any other member functions you wish to implement, and complete the connection point map with the END_CONNECTION_PART macro. +In the declaration (.h) file that defines the member functions for your class, start the connection point with the BEGIN_CONNECTION_PART macro. Then add the CONNECTION_IID macro and any other member functions you wish to implement. Finally, complete the connection point map with the END_CONNECTION_PART macro. ### Requirements @@ -91,7 +91,7 @@ The interface ID of the interface called by the connection point. ### Remarks -The *iid* argument is an interface ID used to identify the interface that the connection point will call on its connected sinks. For example: +The *iid* argument is an interface ID used to identify the interface that the connection point calls on its connected sinks. For example: [!code-cpp[NVC_MFCConnectionPoints#10](../../mfc/codesnippet/cpp/connection-maps_1.h)] @@ -178,7 +178,7 @@ For example: [!code-cpp[NVC_MFCConnectionPoints#2](../../mfc/codesnippet/cpp/connection-maps_2.cpp)] -implements a connection map, with a connection point, that calls the `IID_ISinkInterface` interface . +implements a connection map, with a connection point, that calls the `IID_ISinkInterface` interface. ### Requirements @@ -208,16 +208,14 @@ A pointer to the object that implements the interface. *iid*
The interface ID of the connection. -*bRefCount* - +*bRefCount*
For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. FALSE indicates that the reference count should not be incremented. -**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. - -*pdwCookie.* +**Warning**: In general, it can't be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. +*pdwCookie.*
A pointer to a DWORD where a connection identifier is returned. This value should be passed as the *dwCookie* parameter to `AfxConnectionUnadvise` when disconnecting the connection. ### Return Value @@ -257,7 +255,6 @@ A pointer to the object that implements the interface. The interface ID of the connection point interface. *bRefCount*
- For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. FALSE indicates that the reference count should not be decremented. @@ -265,7 +262,6 @@ For in-process connections, TRUE indicates that creating the connection should c **Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. *dwCookie*
- The connection identifier returned by `AfxConnectionAdvise`. ### Return Value From a839a24b2cd0fb8f0397f6fe8ff694b22d90fce1 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 31 Jul 2023 14:13:47 -0700 Subject: [PATCH 0050/1931] quick edit pass --- docs/sanitizers/asan-continue-on-error.md | 45 ++++++++++++----------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/docs/sanitizers/asan-continue-on-error.md b/docs/sanitizers/asan-continue-on-error.md index 35c73bf80b..0e5694dfc7 100644 --- a/docs/sanitizers/asan-continue-on-error.md +++ b/docs/sanitizers/asan-continue-on-error.md @@ -1,7 +1,7 @@ --- title: "Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues" description: "Learn how to use Address Sanitizer continue on error to find memory safety errors in your app." -ms.date: 07/28/2023 +ms.date: 07/31/2023 f1_keywords: ["AddressSanitizer", "Continue On Error"] helpviewer_keywords: ["ASan", "AddressSanitizer", "Address Sanitizer", "compiling for AddressSanitizer", "Continue On Error", "ASAN continue on error", "Address Sanitizer continue on error"] --- @@ -12,17 +12,17 @@ In this walkthrough, create checked builds that find and report memory safety er Memory safety errors like out-of-bounds memory reads and writes, using memory after it has been freed, `NULL` pointer dereferences, and so on, are a top concern for C/C++ code. Address Sanitizer (ASAN) is a compiler and runtime technology that exposes these kinds of hard-to-find bugs, and does it with zero false positives. For an overview of ASAN, see [AddressSanitizer](asan.md). -Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or a log file of your choice. When you create a standard C++ checked build with `-fsanitizer=address`, calls to allocators, deallocators such as `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. +Continue On Error (COE) is a new ASAN feature that automatically diagnoses and reports memory safety errors as your app runs. When your program exits, a summary of unique memory safety errors is output to `stdout`, `stderr`, or to a log file of your choice. When you create a standard C++ checked build with `-fsanitizer=address`, calls to allocators, deallocators such as `free`, `memcpy`, `memset`, and so on, are forwarded to the ASAN runtime. The ASAN runtime provides the same semantics for these functions, but monitors what happens with the memory. ASAN diagnoses and reports hidden memory safety errors, with zero false positives, as your app runs. -A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is encountered. Instead, ASAN notes the error and your app continues to run. After your app exits, a summary of all the memory issues is output. +A significant advantage of COE is that, unlike the previous ASAN behavior, your program doesn't stop running when the first memory error is found. Instead, ASAN notes the error, and your app continues to run. After your app exits, a summary of all the memory issues is output. -It's a good practice to create a checked build of your C or C++ app with ASAN turned on, and then run your app in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues--without interfering with the tests. +It's a good practice to create a checked build of your C or C++ app with ASAN turned on, and then run your app in your test harness. As your tests exercise the code paths in your app looking for bugs, you'll also find out if those code paths harbor memory safety issues without interfering with the tests. When your app finishes, you get a summary of the memory issues. With COE, you can compile and deploy an existing application into limited production to find memory safety issues. You can run the checked build for days to fully exercise the code, although the app will run slower due to the ASAN instrumentation. -You can use this feature to create a new shipping gate. That is, if all your existing tests pass, but COE reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. +You can use this feature to create a new shipping gate. If all your existing tests pass, but COE reports a memory safety error or a leak, don’t ship the new code or integrate it into a parent branch. -It's important not to deploy a build with COE enabled into production. COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation added to detect memory errors, the risk of exposing the internal implementation if errors are reported, and to avoid increasing the surface area of possible security exploits by shipping the library functions that ASAN substitutes for memory allocation, freeing, and so on. +Don't deploy a build with COE enabled into production! COE is intended to be used in testing and development environments only. You shouldn't use an ASAN enabled build in production because of the performance impact of the instrumentation added to detect memory errors, the risk of exposing the internal implementation if errors are reported, and to avoid increasing the surface area of possible security exploits by shipping the library functions that ASAN substitutes for memory allocation, freeing, and so on. In the following examples, you create checked builds and set an environment variable to output the address sanitizer information to `stdout` to see the memory safety errors that ASAN reports. @@ -32,13 +32,15 @@ To complete this walkthrough, you need Visual Studio 2022 17.6 or later with the ## Double free example -In this example, you create a checked build with ASAN enabled to test what happens when memory is double freed. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, which leads to a second error--using memory that's been freed. A summary of the errors is output to `stdout` when the program exits. +In this example, you create a build with ASAN enabled to test what happens when memory is double freed. ASAN detects this error and reports it. In this example, the program continues to run after the error is detected, which leads to a second error--using memory that's been freed. A summary of the errors is output to `stdout` when the program exits. Create the example: -1. Open a developer command prompt: open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. +1. Open a developer command prompt: Open the **Start** menu, type *Developer*, and select the latest command prompt such as **Developer Command Prompt for VS 2022** from the list of matches. 1. Create a directory on your machine to run this example. For example, `%USERPROFILE%\Desktop\COE`. -1. In that directory, create a source file, for example, `doublefree.cpp`, and paste the following code: +1. In that directory, create an empty source file. For example, `doublefree.cpp` +1. Paste the following code into the file: + ```cpp #include #include @@ -63,11 +65,10 @@ Create the example: In the preceding code, `pointer` is freed twice. This is a contrived example, but double frees are an easy mistake to make in more complex C++ code. -Create a checked build of the preceding code with COE turned on: +Create a build of the preceding code with COE turned on with the following steps: -1. Compile the code using `cl -fsanitize=address -Zi doublefree.cpp`. The `-fsanitize=address` switch turns on ASAN, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. -1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: - `set ASAN_OPTIONS=continue_on_error=1` +1. Compile the code in the developer command prompt you opened earlier: `cl -fsanitize=address -Zi doublefree.cpp`. The `-fsanitize=address` switch turns on ASAN, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. +1. Send ASAN output to `stdout` by setting the `ASAN_OPTIONS` environment variable in the developer command prompt as follows: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `doublefree.exe` The output shows that there was a double free error and the call stack where it happened. The report starts out with a call stack that shows the error happened in `BadFunction`: @@ -147,7 +148,7 @@ File: D:\a\_work\1\s\src\vctools\asan\llvm\compiler-rt\lib\asan\asan_malloc_win_ File: C:\Users\xxx\Desktop\COE\doublefree.cpp Unique call stacks: 1 `````` -Finally, the report contains a summary of where the memory errors occurred. It looks like this: +Finally, the report contains a summary of where the memory errors occurred: ```cmd === Source Code Details: Unique errors caught at instruction offset from source line number, in functions, in the same file. === @@ -171,7 +172,7 @@ File: C:\Users\xxx\Desktop\COE\doublefree.cpp ## Out of bounds memory access example -In this example, you create a checked build with ASAN enabled to test what happens when an app access memory that is out-of-bounds. ASAN detects this error and reports a summary of the errors to `stdout` when the program exits. +In this example, you create a build with ASAN enabled to test what happens when an app access memory that is out-of-bounds. ASAN detects this error and reports a summary of the errors to `stdout` when the program exits. Create the example: @@ -210,10 +211,10 @@ The buffer overflow is due to the loop exit test `<=sz`. When this example runs, Errors are only observable if the page following the allocation is unmapped, or upon use of corrupted data. All other cases are silent in this example. With Continue On Error, the errors are made visible in the summary after the program runs to completion. -Create a checked build of the preceding code with COE turned on: +Create a build of the preceding code with COE turned on: 1. Compile the code with `cl -fsanitize=address -Zi coe.cpp`. The `-fsanitize=address` switch turns on ASAN, and `-Zi` creates a separate PDB file that address sanitizer uses to display memory error location information. -1. To send ASAN output to `stdout`, set the `ASAN_OPTIONS` environment variable: `set ASAN_OPTIONS=continue_on_error=1` +1. Send ASAN output to `stdout` by setting the `ASAN_OPTIONS` environment variable in the developer command prompt as follows: `set ASAN_OPTIONS=continue_on_error=1` 1. Run the test code with: `coe.exe` The output shows that there were two memory buffer overflow errors and provides the call stack for where they happened. The report starts out like this: @@ -276,7 +277,7 @@ Use the `ASAN_OPTIONS` environment variable to determine where to send ASAN outp ## Handling undefined behavior -The ASAN runtime doesn't mimic all of the undefined behaviors of the C and C++ allocation/deallocation functions. The following example demonstrates how the ASAN version **_alloca** differs from the C runtime version: +The ASAN runtime doesn't mimic all of the undefined behaviors of the C and C++ allocation/deallocation functions. The following example demonstrates how the ASAN version of **_alloca** differs from the C runtime version: ```cpp #include @@ -336,9 +337,9 @@ void main() } ``` -In `main()`, a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. +In `main()` a large number is passed to `foo_redundant`, which is ultimately passed to `_alloca()`, which causes `_alloca()` to fail. -This example outputs `pass` when compiled without ASAN (that is, no `-fsanitize=address` switch) but outputs `fail` when compiled with ASAN turned on (that is, with the `-fsanitize=address` switch). That's because without ASAN, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It fails when compiled with ASAN on because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. +This example outputs `pass` when compiled without ASAN (that is, no `-fsanitize=address` switch) but outputs `fail` when compiled with ASAN turned on (that is, with the `-fsanitize=address` switch). That's because without ASAN, the exception code matches `RET_STACK_EXCEPTION` so `cnt` is set to 1. It behaves differently when compiled with ASAN on because the thrown exception is an Address Sanitizer error instead: dynamic-stack-buffer-overflow. That means the code returns `RET_OTHER_EXCEPTION` instead of `RET_STACK_EXCEPTION` so `cnt` isn't set to 1. ## Other benefits @@ -349,5 +350,5 @@ With the new ASAN runtime, no extra binaries need to be deployed with your app. [AddressSanitizer Continue on Error blog post](https://devblogs.microsoft.com/cppblog/addresssanitizer-continue_on_error)\ [Example memory safety errors](asan.md#error-types)\ [-Zi compiler flag](../build/reference/z7-zi-zi-debug-information-format.md#zi)\ -[-fsanitize=address compiler flag](../build/reference/fsanitize.md) -[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html)\ \ No newline at end of file +[-fsanitize=address compiler flag](../build/reference/fsanitize.md)\ +[Top 25 most dangerous software weaknesses](https://cwe.mitre.org/top25/archive/2021/2021_cwe_top25.html) \ No newline at end of file From a032b2dbb88ec04f9a051599b7417c2369eb9f7d Mon Sep 17 00:00:00 2001 From: Mahmoud Saleh <12202790+MahmoudGSaleh@users.noreply.github.com> Date: Tue, 1 Aug 2023 11:00:32 -0700 Subject: [PATCH 0051/1931] Update latest-supported-vc-redist.md * Clarify support for all languages in the redist package * Update wording to highlight VS 2012 is no longer supported --- docs/windows/latest-supported-vc-redist.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/windows/latest-supported-vc-redist.md b/docs/windows/latest-supported-vc-redist.md index a3a96c1150..2707a19d5a 100644 --- a/docs/windows/latest-supported-vc-redist.md +++ b/docs/windows/latest-supported-vc-redist.md @@ -33,13 +33,14 @@ Unlike older versions of Visual Studio, which have infrequent redist updates, th | X86 | [https://aka.ms/vs/17/release/vc_redist.x86.exe](https://aka.ms/vs/17/release/vc_redist.x86.exe) | Permalink for latest supported x86 version | | X64 | [https://aka.ms/vs/17/release/vc_redist.x64.exe](https://aka.ms/vs/17/release/vc_redist.x64.exe) | Permalink for latest supported x64 version. The X64 Redistributable package contains both ARM64 and X64 binaries. This package makes it easy to install required Visual C++ ARM64 binaries when the X64 Redistributable is installed on an ARM64 device. | -Download other languages and versions, including versions for long term servicing release channels (LTSC), from [my.visualstudio.com](https://my.visualstudio.com/). - -> [!NOTE] -> Some of the downloads that are mentioned in this article are currently available on [my.visualstudio.com](https://my.visualstudio.com/). Make sure to log in by using a Visual Studio Subscription account so that you can access the download links. If you're asked for credentials, use your existing Visual Studio subscription account. Or, create a free account by selecting the link in **No account? Create one!** +Download other versions, including long term servicing release channel (LTSC) versions, from [my.visualstudio.com](https://my.visualstudio.com/). ### Notes +- The Visual C++ Redistributable for Visual Studio 2015-2022 does not have separate packages for different languages. It contains EULAs for all supported languages. + +- Some of the downloads that are mentioned in this article are currently available on [my.visualstudio.com](https://my.visualstudio.com/). Make sure to log in by using a Visual Studio Subscription account so that you can access the download links. If you're asked for credentials, use your existing Visual Studio subscription account. Or, create a free account by selecting the link in **No account? Create one!** + - Visual Studio versions since Visual Studio 2015 share the same Redistributable files. For example, any apps built by the Visual Studio 2015, 2017, 2019, or 2022 toolsets can use the latest Microsoft Visual C++ Redistributable. However, the version of the Microsoft Visual C++ Redistributable installed on the machine must be the same or higher than the version of the Visual C++ toolset used to create your application. For more information about which version of the Redistributable to install, see [Determining which DLLs to redistribute](determining-which-dlls-to-redistribute.md). For more information about binary compatibility, see [C++ binary compatibility between Visual Studio versions](../porting/binary-compat-2015-2017.md). - **Windows XP Support**: Microsoft ended support for Windows XP on April 8, 2014. Current versions of the Visual C++ Redistributable for Visual Studio 2015-2022 only support Windows Vista, 7, 8.1, 10, and 11. The last version of the Visual C++ Redistributable that works on Windows XP shipped in Visual Studio 2019 version 16.7 (file versions starting with **14.27**). The Redistributable is available in the [my.visualstudio.com Downloads](https://my.visualstudio.com/Downloads/) section as **Visual C++ Redistributable for Visual Studio 2019 (version 16.7)**. Use the Search box to find this version. To download the files, select the platform and language you need, and then choose the **Download** button. @@ -61,9 +62,12 @@ You can download other versions and languages from [Update for Visual C++ 2013 R - [Multibyte MFC Library for Visual Studio 2013](https://my.visualstudio.com/Downloads?pid=1430). This MFC add-on for Visual Studio 2013 contains the multibyte character set (MBCS) version of the Microsoft Foundation Class (MFC) Library. - [Visual C++ 2013 Runtime for Sideloaded Windows 8.1 apps](https://download.microsoft.com/download/5/f/0/5f0f8404-9329-44a9-8176-ed6f7f746f25/vclibs_redist_packages.zip). For more information, see [C++ Runtime for Sideloaded Windows 8.1 apps](https://devblogs.microsoft.com/cppblog/c-runtime-for-sideloaded-windows-8-1-apps/) on the C++ Team Blog. -## Visual Studio 2012 (VC++ 11.0) Update 4 +## Visual Studio 2012 (VC++ 11.0) Update 4 (no longer supported) + +> [!NOTE] +> Visual Studio 2012 [reached end of extended support on Jan 10, 2023](/lifecycle/products/visual-studio-2012) -These links download the latest supported en-US Microsoft Visual C++ Redistributable packages for Visual Studio 2012 Update 4. You can download other versions and languages from [Microsoft Visual C++ Redistributable Packages for Visual Studio 2012 Update 4](https://www.microsoft.com/download/details.aspx?id=30679) or from [my.visualstudio.com](https://my.visualstudio.com/Downloads?pid=1452). +These links download the latest available en-US Microsoft Visual C++ Redistributable packages for Visual Studio 2012 Update 4. You can download other versions and languages from [Microsoft Visual C++ Redistributable Packages for Visual Studio 2012 Update 4](https://www.microsoft.com/download/details.aspx?id=30679) or from [my.visualstudio.com](https://my.visualstudio.com/Downloads?pid=1452). | Architecture | Version | Link | |--|:-:|-:| From cbf41cc131c7fa9df3812c37d75ca12c0917808a Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 1 Aug 2023 12:40:14 -0700 Subject: [PATCH 0052/1931] fix github issue 4666 and fix error from checkin yesterday --- .../compiler-errors-1/compiler-error-c2039.md | 9 +- docs/mfc/reference/connection-maps.md | 160 +++++++++--------- 2 files changed, 83 insertions(+), 86 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2039.md b/docs/error-messages/compiler-errors-1/compiler-error-c2039.md index f84cbdefa6..a38cdf203a 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2039.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2039.md @@ -1,10 +1,9 @@ --- description: "Learn more about: Compiler Error C2039" title: "Compiler Error C2039" -ms.date: "11/04/2016" +ms.date: "8/1/2023" f1_keywords: ["C2039"] helpviewer_keywords: ["C2039"] -ms.assetid: f9dfd521-9b36-4454-a69c-d63f45b606bb --- # Compiler Error C2039 @@ -57,9 +56,9 @@ int S::get_Count() { return 0; } // C2039 int S::Count::get() { return 0; } // OK ``` -C2039 can also occur if you attempt to access a default indexer incorrectly. The following sample defines a component authored in C#. +C2039 can also occur if you attempt to access a default indexer incorrectly. To demonstrate, the following code defines a component authored in C# that will be accessed by the C++/CLI code that follows: -``` +```c# // C2039_d.cs // compile with: /target:library // a C# program @@ -72,7 +71,7 @@ public class B { }; ``` -The following sample generates C2039. +The following sample generates C2039 when it uses the previously defined C# component's default indexer incorrectly from C++/CLI: ```cpp // C2039_e.cpp diff --git a/docs/mfc/reference/connection-maps.md b/docs/mfc/reference/connection-maps.md index 2696f0b103..c6453c605f 100644 --- a/docs/mfc/reference/connection-maps.md +++ b/docs/mfc/reference/connection-maps.md @@ -1,175 +1,174 @@ --- description: "Learn more about: Connection Maps" title: "Connection Maps" -ms.date: "11/04/2016" +ms.date: "8/1/2023" helpviewer_keywords: ["connection maps"] -ms.assetid: 1f25a9bc-6d09-4614-99cf-dc38e8ddfa73 --- -# Connection Maps +# Connection maps OLE controls are able to expose interfaces to other applications. These interfaces only allow access from a container into that control. If an OLE control wants to access external interfaces of other OLE objects, a connection point must be established. This connection point allows a control outgoing access to external dispatch maps, such as event maps or notification functions. -The Microsoft Foundation Class Library offers a programming model that supports connection points. In this model, "connection maps" are used to designate interfaces or connection points for the OLE control. Connection maps contain one macro for each connection point. For more information on connection maps, see the [CConnectionPoint](../../mfc/reference/cconnectionpoint-class.md) class. +The Microsoft Foundation Class Library offers a programming model that supports connection points. In this model, "connection maps" are used to designate interfaces or connection points for the OLE control. Connection maps contain one macro for each connection point. For more information on connection maps, see the [`CConnectionPoint`](../../mfc/reference/cconnectionpoint-class.md) class. Typically, a control supports just two connection points: one for events and one for property notifications. These are implemented by the `COleControl` base class and require no extra work by the control writer. Any other connection points you want to implement in your class must be added manually. To support connection maps and points, MFC provides the following macros: -### Connection Map Declaration and Demarcation +### Connection Map declaration and demarcation |Name|Description| |-|-| -|[BEGIN_CONNECTION_PART](#begin_connection_part)|Declares an embedded class that implements an additional connection point (must be used in the class declaration).| -|[END_CONNECTION_PART](#end_connection_part)|Ends the declaration of a connection point (must be used in the class declaration).| -|[CONNECTION_IID](#connection_iid)|Specifies the interface ID of the control's connection point.| -|[DECLARE_CONNECTION_MAP](#declare_connection_map)|Declares that a connection map will be used in a class (must be used in the class declaration).| -|[BEGIN_CONNECTION_MAP](#begin_connection_map)|Begins the definition of a connection map (must be used in the class implementation).| -|[END_CONNECTION_MAP](#end_connection_map)|Ends the definition of a connection map (must be used in the class implementation).| -|[CONNECTION_PART](#connection_part)|Specifies a connection point in the control's connection map.| +|[`BEGIN_CONNECTION_PART`](#BEGIN_CONNECTION_PART)|Declares an embedded class that implements an additional connection point (must be used in the class declaration).| +|[`END_CONNECTION_PART`](#END_CONNECTION_PART)|Ends the declaration of a connection point (must be used in the class declaration).| +|[`CONNECTION_IID`](#CONNECTION_IID)|Specifies the interface ID of the control's connection point.| +|[`DECLARE_CONNECTION_MAP`](#DECLARE_CONNECTION_MAP)|Declares that a connection map will be used in a class (must be used in the class declaration).| +|[`BEGIN_CONNECTION_MAP`](#BEGIN_CONNECTION_MAP)|Begins the definition of a connection map (must be used in the class implementation).| +|[`END_CONNECTION_MAP`](#END_CONNECTION_MAP)|Ends the definition of a connection map (must be used in the class implementation).| +|[`CONNECTION_PART`](#CONNECTION_PART)|Specifies a connection point in the control's connection map.| The following functions assist a sink in establishing and disconnecting a connection using connection points: -### Initialization/Termination of Connection Points +### Initialization/termination of connection points |Name|Description| |-|-| -|[AfxConnectionAdvise](#afxconnectionadvise)|Establishes a connection between a source and a sink.| -|[AfxConnectionUnadvise](#afxconnectionunadvise)|Breaks a connection between a source and a sink.| +|[`AfxConnectionAdvise`](#AfxConnectionAdvise)|Establishes a connection between a source and a sink.| +|[`AfxConnectionUnadvise`](#AfxConnectionUnadvise)|Breaks a connection between a source and a sink.| -## BEGIN_CONNECTION_PART +## `BEGIN_CONNECTION_PART` -Use the BEGIN_CONNECTION_PART macro to begin the definition of additional connection points beyond the event and property notification connection points. +Use the `BEGIN_CONNECTION_PART` macro to begin the definition of additional connection points beyond the event and property notification connection points. -``` +```cpp BEGIN_CONNECTION_PART(theClass, localClass) ``` ### Parameters -*theClass*
+*`theClass`* Specifies the name of the control class whose connection point this is. -*localClass*
+*`localClass`* Specifies the name of the local class that implements the connection point. ### Remarks -In the declaration (.h) file that defines the member functions for your class, start the connection point with the BEGIN_CONNECTION_PART macro. Then add the CONNECTION_IID macro and any other member functions you wish to implement. Finally, complete the connection point map with the END_CONNECTION_PART macro. +In the declaration (`.h`) file that defines the member functions for your class, start the connection point with the `BEGIN_CONNECTION_PART` macro. Then add the `CONNECTION_IID` macro and any other member functions you wish to implement. Finally, complete the connection point map with the `END_CONNECTION_PART` macro. ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## END_CONNECTION_PART +## `END_CONNECTION_PART` Ends the declaration of your connection point. -``` +```cpp END_CONNECTION_PART(localClass) ``` ### Parameters -*localClass*
+*`localClass`*\ Specifies the name of the local class that implements the connection point. ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## CONNECTION_IID +## `CONNECTION_IID` -Use between the BEGIN_CONNECTION_PART and END_CONNECTION_PART macros to define an interface ID for a connection point supported by your OLE control. +Use between the `BEGIN_CONNECTION_PART` and `END_CONNECTION_PART` macros to define an interface ID for a connection point supported by your OLE control. -``` +```cpp CONNECTION_IID(iid) ``` ### Parameters -*iid*
+*`iid`*\ The interface ID of the interface called by the connection point. ### Remarks -The *iid* argument is an interface ID used to identify the interface that the connection point calls on its connected sinks. For example: +The *`iid`* argument is an interface ID used to identify the interface that the connection point calls on its connected sinks. For example: [!code-cpp[NVC_MFCConnectionPoints#10](../../mfc/codesnippet/cpp/connection-maps_1.h)] -specifies a connection point that calls the `ISinkInterface` interface. +Specifies a connection point that calls the `ISinkInterface` interface. ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## DECLARE_CONNECTION_MAP +## `DECLARE_CONNECTION_MAP` Each `COleControl`-derived class in your program can provide a connection map to specify additional connection points that your control supports. -``` +```cpp DECLARE_CONNECTION_MAP() ``` ### Remarks -If your control supports additional points, use the DECLARE_CONNECTION_MAP macro at the end of your class declaration. Then, in the .cpp file that defines the member functions for the class, use the BEGIN_CONNECTION_MAP macro, CONNECTION_PART macros for each of the control's connection points, and the END_CONNECTION_MAP macro to declare the end of the connection map. +If your control supports additional points, use the `DECLARE_CONNECTION_MAP` macro at the end of your class declaration. Then, in the .cpp file that defines the member functions for the class, use the `BEGIN_CONNECTION_MAP` macro, `CONNECTION_PART` macros for each of the control's connection points, and the `END_CONNECTION_MAP` macro to declare the end of the connection map. ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## BEGIN_CONNECTION_MAP +## `BEGIN_CONNECTION_MAP` Each `COleControl`-derived class in your program can provide a connection map to specify connection points that your control will support. -``` +```cpp BEGIN_CONNECTION_MAP(theClass, theBase) ``` ### Parameters -*theClass*
+*`theClass`*\ Specifies the name of the control class whose connection map this is. -*theBase*
-Specifies the name of the base class of *theClass*. +*`theBase`*\ +Specifies the name of the base class of *`theClass`*. ### Remarks -In the implementation (.CPP) file that defines the member functions for your class, start the connection map with the BEGIN_CONNECTION_MAP macro, then add macro entries for each of your connection points using the [CONNECTION_PART](#connection_part) macro. Finally, complete the connection map with the [END_CONNECTION_MAP](#end_connection_map) macro. +In the implementation (`.CPP`) file that defines the member functions for your class, start the connection map with the `BEGIN_CONNECTION_MAP` macro, then add macro entries for each of your connection points using the [`CONNECTION_PART`](#CONNECTION_PART) macro. Finally, complete the connection map with the [`END_CONNECTION_MAP`](#END_CONNECTION_MAP) macro. ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## END_CONNECTION_MAP +## `END_CONNECTION_MAP` Ends the definition of your connection map. -``` +```cpp END_CONNECTION_MAP() ``` ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## CONNECTION_PART +## `CONNECTION_PART` Maps a connection point for your OLE control to a specific interface ID. -``` +```cpp CONNECTION_PART(theClass, iid, localClass) ``` ### Parameters -*theClass*
+*`theClass`*\ Specifies the name of the control class whose connection point this is. -*iid*
+*`iid`*\ The interface ID of the interface called by the connection point. -*localClass*
+*`localClass`*\ Specifies the name of the local class that implements the connection point. ### Remarks @@ -182,13 +181,13 @@ implements a connection map, with a connection point, that calls the `IID_ISinkI ### Requirements - **Header** afxdisp.h +**Header** `afxdisp.h` -## AfxConnectionAdvise +## `AfxConnectionAdvise` -Call this function to establish a connection between a source, specified by *pUnkSrc*, and a sink, specified by *pUnkSink*. +Call this function to establish a connection between a source, specified by *`pUnkSrc`*, and a sink, specified by *`pUnkSink`*. -``` +```cpp BOOL AFXAPI AfxConnectionAdvise( LPUNKNOWN pUnkSrc, REFIID iid, @@ -199,24 +198,24 @@ BOOL AFXAPI AfxConnectionAdvise( ### Parameters -*pUnkSrc*
+*`pUnkSrc`*\ A pointer to the object that calls the interface. -*pUnkSink*
+*`pUnkSink`*\ A pointer to the object that implements the interface. -*iid*
+*`iid`*\ The interface ID of the connection. -*bRefCount*
-For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. +*`bRefCount`*\ +For out-of-process connections, this parameter must be `TRUE`, and indicates that creating the connection should cause the reference count of *`pUnkSink`* to be incremented. -For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be incremented. FALSE indicates that the reference count should not be incremented. +For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be incremented. `FALSE` indicates that the reference count should not be incremented. -**Warning**: In general, it can't be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. +**Warning**: In general, it can't be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to `TRUE`. -*pdwCookie.*
-A pointer to a DWORD where a connection identifier is returned. This value should be passed as the *dwCookie* parameter to `AfxConnectionUnadvise` when disconnecting the connection. +*`pdwCookie`*\ +A pointer to a `DWORD` where a connection identifier is returned. This value should be passed as the *`dwCookie`* parameter to `AfxConnectionUnadvise` when disconnecting the connection. ### Return Value @@ -228,13 +227,13 @@ Nonzero if a connection was established; otherwise 0. ### Requirements -**Header:** afxctl.h +**Header:** `afxctl.h` -## AfxConnectionUnadvise +## `AfxConnectionUnadvise` -Call this function to disconnect a connection between a source, specified by *pUnkSrc*, and a sink, specified by *pUnkSink*. +Call this function to disconnect a connection between a source, specified by *pUnkSrc*, and a sink, specified by *`pUnkSink`*. -``` +```cpp BOOL AFXAPI AfxConnectionUnadvise( LPUNKNOWN pUnkSrc, REFIID iid, @@ -245,26 +244,26 @@ BOOL AFXAPI AfxConnectionUnadvise( ### Parameters -*pUnkSrc*
+*`pUnkSrc`*\ A pointer to the object that calls the interface. -*pUnkSink*
+*`pUnkSink`*\ A pointer to the object that implements the interface. -*iid*
+*`iid`*\ The interface ID of the connection point interface. -*bRefCount*
-For out-of-process connections, this parameter must be TRUE, and indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. +*`bRefCount`*\ +For out-of-process connections, this parameter must be `TRUE`, and indicates that creating the connection should cause the reference count of *`pUnkSink`* to be decremented. -For in-process connections, TRUE indicates that creating the connection should cause the reference count of *pUnkSink* to be decremented. FALSE indicates that the reference count should not be decremented. +For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be decremented. `FALSE` indicates that the reference count should not be decremented. -**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to TRUE. +**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to `TRUE`. -*dwCookie*
-The connection identifier returned by `AfxConnectionAdvise`. +*`dwCookie`*\ +The connection identifier returned by ``AfxConnectionAdvise``. -### Return Value +### Return value Nonzero if a connection was disconnected; otherwise 0. @@ -278,5 +277,4 @@ Nonzero if a connection was disconnected; otherwise 0. ## See also -[Macros and Globals](../../mfc/reference/mfc-macros-and-globals.md) - +[Macros and Globals](../../mfc/reference/mfc-macros-and-globals.md) \ No newline at end of file From 268a56d5f9c444bf0405656bbcb1e0c8b63f0366 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 1 Aug 2023 13:12:33 -0700 Subject: [PATCH 0053/1931] acrolinx --- .../compiler-errors-1/compiler-error-c2039.md | 14 +++++++------- docs/mfc/reference/connection-maps.md | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2039.md b/docs/error-messages/compiler-errors-1/compiler-error-c2039.md index a38cdf203a..0264758359 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2039.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2039.md @@ -7,13 +7,13 @@ helpviewer_keywords: ["C2039"] --- # Compiler Error C2039 -'identifier1' : is not a member of 'identifier2' +`'identifier1' : is not a member of 'identifier2'` The code incorrectly calls or refers to a member of a structure, class, or union. ## Examples -The following sample generates C2039. +The following sample generates C2039: ```cpp // C2039.cpp @@ -27,7 +27,7 @@ int main() { } ``` -The following sample generates C2039. +The following sample generates C2039: ```cpp // C2039_b.cpp @@ -40,7 +40,7 @@ int main() { } ``` -The following sample generates C2039. +The following sample generates C2039: ```cpp // C2039_c.cpp @@ -56,7 +56,7 @@ int S::get_Count() { return 0; } // C2039 int S::Count::get() { return 0; } // OK ``` -C2039 can also occur if you attempt to access a default indexer incorrectly. To demonstrate, the following code defines a component authored in C# that will be accessed by the C++/CLI code that follows: +C2039 can also occur if you attempt to access a default indexer incorrectly. To demonstrate, this code defines a C# component that is used by the C++/CLI code that follows: ```c# // C2039_d.cs @@ -88,7 +88,7 @@ int main() { } ``` -C2039 can also occur if you use generics. The following sample generates C2039. +C2039 can also occur if you use generics. The following sample generates C2039: ```cpp // C2039_f.cpp @@ -113,7 +113,7 @@ int main() { C2039 can occur when you try to release managed or unmanaged resources. For more information, see [Destructors and finalizers](../../dotnet/how-to-define-and-consume-classes-and-structs-cpp-cli.md#BKMK_Destructors_and_finalizers). -The following sample generates C2039. +The following sample generates C2039: ```cpp // C2039_g.cpp diff --git a/docs/mfc/reference/connection-maps.md b/docs/mfc/reference/connection-maps.md index c6453c605f..cab71e3299 100644 --- a/docs/mfc/reference/connection-maps.md +++ b/docs/mfc/reference/connection-maps.md @@ -210,7 +210,7 @@ The interface ID of the connection. *`bRefCount`*\ For out-of-process connections, this parameter must be `TRUE`, and indicates that creating the connection should cause the reference count of *`pUnkSink`* to be incremented. -For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be incremented. `FALSE` indicates that the reference count should not be incremented. +For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be incremented. `FALSE` indicates that the reference count shouldn't be incremented. **Warning**: In general, it can't be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to `TRUE`. @@ -231,7 +231,7 @@ Nonzero if a connection was established; otherwise 0. ## `AfxConnectionUnadvise` -Call this function to disconnect a connection between a source, specified by *pUnkSrc*, and a sink, specified by *`pUnkSink`*. +Call this function to disconnect a connection between a source, specified by *`pUnkSrc`*, and a sink, specified by *`pUnkSink`*. ```cpp BOOL AFXAPI AfxConnectionUnadvise( @@ -256,9 +256,9 @@ The interface ID of the connection point interface. *`bRefCount`*\ For out-of-process connections, this parameter must be `TRUE`, and indicates that creating the connection should cause the reference count of *`pUnkSink`* to be decremented. -For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be decremented. `FALSE` indicates that the reference count should not be decremented. +For in-process connections, `TRUE` indicates that creating the connection should cause the reference count of *`pUnkSink`* to be decremented. `FALSE` indicates that the reference count shouldn't be decremented. -**Warning**: In general, it cannot be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to `TRUE`. +**Warning**: In general, it can't be predicted which connections are in-process and which connections are out-of-process, so it is recommended to always set this parameter to `TRUE`. *`dwCookie`*\ The connection identifier returned by ``AfxConnectionAdvise``. @@ -273,7 +273,7 @@ Nonzero if a connection was disconnected; otherwise 0. ### Requirements -**Header:** afxctl.h +**Header:** `afxctl.h` ## See also From 0e0c4a8b750a3b52e706cfb1420ec7f4ec4a31d9 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 2 Aug 2023 14:03:05 -0700 Subject: [PATCH 0054/1931] fix function signature --- docs/c-runtime-library/reference/qsort.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/c-runtime-library/reference/qsort.md b/docs/c-runtime-library/reference/qsort.md index b465c704a9..9364fefb82 100644 --- a/docs/c-runtime-library/reference/qsort.md +++ b/docs/c-runtime-library/reference/qsort.md @@ -1,7 +1,7 @@ --- title: "qsort" description: "Describes the Microsoft C runtime quick sort API `qsort`" -ms.date: "10/23/2020" +ms.date: "8/2/2023" api_name: ["qsort", "_o_qsort"] api_location: ["msvcrt.dll", "msvcr80.dll", "msvcr90.dll", "msvcr100.dll", "msvcr100_clr0400.dll", "msvcr110.dll", "msvcr110_clr0400.dll", "msvcr120.dll", "msvcr120_clr0400.dll", "ntdll.dll", "ucrtbase.dll", "api-ms-win-crt-utility-l1-1-0.dll", "ntoskrnl.exe"] api_type: ["DLLExport"] @@ -45,7 +45,7 @@ The **`qsort`** function implements a quick-sort algorithm to sort an array of * **`qsort`** calls the *`compare`* routine one or more times during the sort, and passes pointers to two array elements on each call. If *`compare`* indicates two elements are the same, their order in the resulting sorted array is unspecified. ```C -compare( (void *) & elem1, (void *) & elem2 ); +compare(const void *elem1, const void *elem2); ``` The routine compares the elements and returns one of the following values. From 16e5962699e126444869aaa36e64a4cfcb38881e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 2 Aug 2023 14:37:40 -0700 Subject: [PATCH 0055/1931] update date --- docs/windows/latest-supported-vc-redist.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/windows/latest-supported-vc-redist.md b/docs/windows/latest-supported-vc-redist.md index 2707a19d5a..f77e74f200 100644 --- a/docs/windows/latest-supported-vc-redist.md +++ b/docs/windows/latest-supported-vc-redist.md @@ -1,7 +1,7 @@ --- title: "Latest supported Visual C++ Redistributable downloads" description: "This article lists the download links for the latest versions of Visual C++ Redistributable packages." -ms.date: 04/24/2023 +ms.date: 08/02/2023 helpviewer_keywords: [ "redist", @@ -39,7 +39,7 @@ Download other versions, including long term servicing release channel (LTSC) ve - The Visual C++ Redistributable for Visual Studio 2015-2022 does not have separate packages for different languages. It contains EULAs for all supported languages. -- Some of the downloads that are mentioned in this article are currently available on [my.visualstudio.com](https://my.visualstudio.com/). Make sure to log in by using a Visual Studio Subscription account so that you can access the download links. If you're asked for credentials, use your existing Visual Studio subscription account. Or, create a free account by selecting the link in **No account? Create one!** +- Some of the downloads that are mentioned in this article are currently available on [my.visualstudio.com](https://my.visualstudio.com/). Log in using a Visual Studio Subscription account so that you can access the download links. If you're asked for credentials, use your existing Visual Studio subscription account. Or, create a free account by choosing the **No account? Create one!** link. - Visual Studio versions since Visual Studio 2015 share the same Redistributable files. For example, any apps built by the Visual Studio 2015, 2017, 2019, or 2022 toolsets can use the latest Microsoft Visual C++ Redistributable. However, the version of the Microsoft Visual C++ Redistributable installed on the machine must be the same or higher than the version of the Visual C++ toolset used to create your application. For more information about which version of the Redistributable to install, see [Determining which DLLs to redistribute](determining-which-dlls-to-redistribute.md). For more information about binary compatibility, see [C++ binary compatibility between Visual Studio versions](../porting/binary-compat-2015-2017.md). From bbfc38101d75f1e5bd6b62e20343c0d45fbe2d4d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 2 Aug 2023 14:41:14 -0700 Subject: [PATCH 0056/1931] acrolinx --- docs/windows/latest-supported-vc-redist.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/windows/latest-supported-vc-redist.md b/docs/windows/latest-supported-vc-redist.md index f77e74f200..24e65686d1 100644 --- a/docs/windows/latest-supported-vc-redist.md +++ b/docs/windows/latest-supported-vc-redist.md @@ -37,7 +37,7 @@ Download other versions, including long term servicing release channel (LTSC) ve ### Notes -- The Visual C++ Redistributable for Visual Studio 2015-2022 does not have separate packages for different languages. It contains EULAs for all supported languages. +- The Visual C++ Redistributable for Visual Studio 2015-2022 doesn't have separate packages for different languages. It contains EULAs for all supported languages. - Some of the downloads that are mentioned in this article are currently available on [my.visualstudio.com](https://my.visualstudio.com/). Log in using a Visual Studio Subscription account so that you can access the download links. If you're asked for credentials, use your existing Visual Studio subscription account. Or, create a free account by choosing the **No account? Create one!** link. From cfe68330243cbda249b57073b46f0ffd09518b48 Mon Sep 17 00:00:00 2001 From: Glenn Slayden <5589855+glenn-slayden@users.noreply.github.com> Date: Fri, 4 Aug 2023 21:38:24 -0700 Subject: [PATCH 0057/1931] Update integritycheck-require-signature-check.md --- .../reference/integritycheck-require-signature-check.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/integritycheck-require-signature-check.md b/docs/build/reference/integritycheck-require-signature-check.md index ce1a75938e..33b60c02cb 100644 --- a/docs/build/reference/integritycheck-require-signature-check.md +++ b/docs/build/reference/integritycheck-require-signature-check.md @@ -7,7 +7,7 @@ ms.date: 04/21/2021 Specifies that the digital signature of the binary image must be checked at load time. -> **`/INTEGRITYCHECK`**[**`:NO`**] +> **`/INTEGRITYCHECK`** ## Remarks @@ -25,7 +25,11 @@ Microsoft has new signing guidance for DLL and executable files linked by using 1. Select the **Configuration Properties** > **Linker** > **Command Line** property page. -1. In **Additional Options**, enter *`/INTEGRITYCHECK`* or *`/INTEGRITYCHECK:NO`*. Choose **OK** to save your changes. +1. To build an image which requires digital signature verification to be loaded, add *`/INTEGRITYCHECK`* to the **Additional Options** command line. + +1. To disable the feature, remove the *`/INTEGRITYCHECK`* option. + +1. Choose **OK** to save your changes. ## See also From 14813bcb83c969286ce910eaa2bc8b2f75af585a Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Mon, 7 Aug 2023 15:29:55 -0700 Subject: [PATCH 0058/1931] Learn Editor: Update ccomdynamicunkarray-class.md --- .../reference/ccomdynamicunkarray-class.md | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 19adbd15a5..d4b1b1bbc5 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -6,6 +6,7 @@ f1_keywords: ["CComDynamicUnkArray", "ATLCOM/ATL::CComDynamicUnkArray", "ATLCOM/ helpviewer_keywords: ["connection points [C++], managing", "CComDynamicUnkArray class"] ms.assetid: 202470d7-9a1b-498f-b96d-659d681acd65 --- + # CComDynamicUnkArray Class This class stores an array of `IUnknown` pointers. @@ -35,7 +36,7 @@ class CComDynamicUnkArray |[CComDynamicUnkArray::end](#end)|Returns a pointer to one past the last `IUnknown` pointer in the collection.| |[CComDynamicUnkArray::GetAt](#getat)|Retrieves the element at the specified index.| |[CComDynamicUnkArray::GetCookie](#getcookie)|Call this method to get the cookie associated with a given `IUnknown` pointer.| -|[CComDynamicUnkArray::GetSize](#getsize)|Returns the length of an array.| +|[CComDynamicUnkArray::GetSize](#getsize)|Returns the allocated capacity of the array.| |[CComDynamicUnkArray::GetUnknown](#getunknown)|Call this method to get the `IUnknown` pointer associated with a given cookie.| |[CComDynamicUnkArray::Remove](#remove)|Call this method to remove an `IUnknown` pointer from the array.| @@ -69,7 +70,7 @@ The `IUnknown` pointer to add to the array. ### Return Value -Returns the cookie associated with the newly added pointer. +Returns the cookie associated with the newly added pointer. Use this cookie to retrieve the pointer from the array with [CComDynamicUnkArray::GetAt](#getat). ## CComDynamicUnkArray::begin @@ -92,7 +93,7 @@ Before using the `IUnknown` interface, you should check that it is not NULL. ## CComDynamicUnkArray::clear -Empties the array. +Empties the array, resetting the size to 0. ```cpp void clear(); @@ -124,7 +125,9 @@ Frees resources allocated by the class constructor. ## CComDynamicUnkArray::end -Returns a pointer to one past the last `IUnknown` pointer in the collection. +Returns a pointer to one-past the last element in the array's allocated buffer. + +Note: this means that the last-inserted pointer is not guaranteed to be found at `end()-1`, since the array's capacity might not have yet been reached. ``` IUnknown** @@ -150,7 +153,7 @@ The index of the element to retrieve. ### Return Value -A pointer to an [IUnknown](/windows/win32/api/unknwn/nn-unknwn-iunknown) interface. +A pointer to an [IUnknown](/windows/win32/api/unknwn/nn-unknwn-iunknown) interface, if an element was previously added and exists at this index; NULL otherwise. ## CComDynamicUnkArray::GetCookie @@ -175,7 +178,9 @@ If there is more than one instance of the same `IUnknown` pointer, this function ## CComDynamicUnkArray::GetSize -Returns the length of an array. +Returns the allocated capacity of the array. + +Note: this is not the same as the number of non-NULL elements currently in the array. ``` int GetSize() const; @@ -183,9 +188,9 @@ int GetSize() const; ### Return Value -The length of the array. +The number of elements for which the array has currently allocated space. `GetSize() == end() - begin()`. -## CComDynamicUnkArray::GetUnknown +## CComDynamicUnkArray::GetUnknown Call this method to get the `IUnknown` pointer associated with a given cookie. @@ -223,3 +228,4 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) + From 60607a7962cf4e79aa9879e592686c68004a3636 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:10:44 -0700 Subject: [PATCH 0059/1931] Learn Editor: Update ccomdynamicunkarray-class.md --- docs/atl/reference/ccomdynamicunkarray-class.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index d4b1b1bbc5..5e85b455ec 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -211,6 +211,8 @@ Returns the `IUnknown` pointer, or NULL if no matching cookie is found. Call this method to remove an `IUnknown` pointer from the array. +Note: All other elements are unchanged and retain their index and cookie. + ``` BOOL Remove(DWORD dwCookie); ``` @@ -229,3 +231,4 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) + From 0ebddc06346e9dc764615a1da63d77c8b9fb99b2 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Tue, 8 Aug 2023 11:13:26 -0700 Subject: [PATCH 0060/1931] Tweak whitespace --- docs/atl/reference/ccomdynamicunkarray-class.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 5e85b455ec..1456b65706 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -6,7 +6,6 @@ f1_keywords: ["CComDynamicUnkArray", "ATLCOM/ATL::CComDynamicUnkArray", "ATLCOM/ helpviewer_keywords: ["connection points [C++], managing", "CComDynamicUnkArray class"] ms.assetid: 202470d7-9a1b-498f-b96d-659d681acd65 --- - # CComDynamicUnkArray Class This class stores an array of `IUnknown` pointers. @@ -188,7 +187,7 @@ int GetSize() const; ### Return Value -The number of elements for which the array has currently allocated space. `GetSize() == end() - begin()`. +The number of elements for which the array has currently allocated space. `GetSize() == end() - begin()`. ## CComDynamicUnkArray::GetUnknown @@ -230,5 +229,3 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) - - From ff2c0ec0b086a9280a4f63ecfccac9a237eee001 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Tue, 8 Aug 2023 11:14:02 -0700 Subject: [PATCH 0061/1931] Learn Editor: Update ccomdynamicunkarray-class.md --- docs/atl/reference/ccomdynamicunkarray-class.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 1456b65706..911c3b9342 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -6,6 +6,7 @@ f1_keywords: ["CComDynamicUnkArray", "ATLCOM/ATL::CComDynamicUnkArray", "ATLCOM/ helpviewer_keywords: ["connection points [C++], managing", "CComDynamicUnkArray class"] ms.assetid: 202470d7-9a1b-498f-b96d-659d681acd65 --- + # CComDynamicUnkArray Class This class stores an array of `IUnknown` pointers. @@ -229,3 +230,4 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) + From ce7299615ea47b2053a2b46d2c509c92cb4cded6 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets <89153909+dmitrykobets-msft@users.noreply.github.com> Date: Tue, 8 Aug 2023 12:26:57 -0700 Subject: [PATCH 0062/1931] Learn Editor: Update ccomdynamicunkarray-class.md --- docs/atl/reference/ccomdynamicunkarray-class.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 911c3b9342..0c871efc76 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -72,6 +72,10 @@ The `IUnknown` pointer to add to the array. Returns the cookie associated with the newly added pointer. Use this cookie to retrieve the pointer from the array with [CComDynamicUnkArray::GetAt](#getat). +### Remarks + +The position this item is inserted will not necessarily be directly after the last-inserted item, if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. + ## CComDynamicUnkArray::begin Returns a pointer to the beginning of the collection of `IUnknown` interface pointers. @@ -231,3 +235,4 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) + From 0ffe6d52492e1284f2fc3bb660737cb1f0fd0443 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Tue, 8 Aug 2023 12:28:21 -0700 Subject: [PATCH 0063/1931] Tweak whitespace --- docs/atl/reference/ccomdynamicunkarray-class.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 0c871efc76..58c711135e 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -6,7 +6,6 @@ f1_keywords: ["CComDynamicUnkArray", "ATLCOM/ATL::CComDynamicUnkArray", "ATLCOM/ helpviewer_keywords: ["connection points [C++], managing", "CComDynamicUnkArray class"] ms.assetid: 202470d7-9a1b-498f-b96d-659d681acd65 --- - # CComDynamicUnkArray Class This class stores an array of `IUnknown` pointers. @@ -129,7 +128,7 @@ Frees resources allocated by the class constructor. ## CComDynamicUnkArray::end -Returns a pointer to one-past the last element in the array's allocated buffer. +Returns a pointer to one-past the last element in the array's allocated buffer. Note: this means that the last-inserted pointer is not guaranteed to be found at `end()-1`, since the array's capacity might not have yet been reached. @@ -234,5 +233,3 @@ Returns TRUE if the pointer is removed; otherwise FALSE. [CComUnkArray Class](../../atl/reference/ccomunkarray-class.md)
[Class Overview](../../atl/atl-class-overview.md) - - From ff59040c1897e30d9c148c1e48ff25714f095a17 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Tue, 8 Aug 2023 15:14:31 -0700 Subject: [PATCH 0064/1931] Update ccomdynamicunkarray-class.md a few edits and fix broken link --- docs/atl/reference/ccomdynamicunkarray-class.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 58c711135e..6753b41013 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -35,7 +35,7 @@ class CComDynamicUnkArray |[CComDynamicUnkArray::end](#end)|Returns a pointer to one past the last `IUnknown` pointer in the collection.| |[CComDynamicUnkArray::GetAt](#getat)|Retrieves the element at the specified index.| |[CComDynamicUnkArray::GetCookie](#getcookie)|Call this method to get the cookie associated with a given `IUnknown` pointer.| -|[CComDynamicUnkArray::GetSize](#getsize)|Returns the allocated capacity of the array.| +|[CComDynamicUnkArray::GetSize](#getsize)|Returns the number of elements the array can store.| |[CComDynamicUnkArray::GetUnknown](#getunknown)|Call this method to get the `IUnknown` pointer associated with a given cookie.| |[CComDynamicUnkArray::Remove](#remove)|Call this method to remove an `IUnknown` pointer from the array.| @@ -73,7 +73,7 @@ Returns the cookie associated with the newly added pointer. Use this cookie to r ### Remarks -The position this item is inserted will not necessarily be directly after the last-inserted item, if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. +The position where this item is inserted won't necessarily be directly after the last-inserted item if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. ## CComDynamicUnkArray::begin @@ -96,7 +96,7 @@ Before using the `IUnknown` interface, you should check that it is not NULL. ## CComDynamicUnkArray::clear -Empties the array, resetting the size to 0. +Empties the array. Resets the size to 0. ```cpp void clear(); @@ -130,7 +130,7 @@ Frees resources allocated by the class constructor. Returns a pointer to one-past the last element in the array's allocated buffer. -Note: this means that the last-inserted pointer is not guaranteed to be found at `end()-1`, since the array's capacity might not have yet been reached. +Note: this means that the last-inserted pointer is not guaranteed to be at `end()-1` because the array may not be filled to capacity. ``` IUnknown** @@ -156,7 +156,7 @@ The index of the element to retrieve. ### Return Value -A pointer to an [IUnknown](/windows/win32/api/unknwn/nn-unknwn-iunknown) interface, if an element was previously added and exists at this index; NULL otherwise. +A pointer to an [IUnknown](/windows/win32/api/unknwn/nn-unknwn-iunknown) interface if an element was previously added and exists at this index; otherwise `NULL`. ## CComDynamicUnkArray::GetCookie @@ -191,9 +191,9 @@ int GetSize() const; ### Return Value -The number of elements for which the array has currently allocated space. `GetSize() == end() - begin()`. +The number of elements the array can store. `GetSize() == end() - begin()`. -## CComDynamicUnkArray::GetUnknown +## CComDynamicUnkArray::GetUnknown Call this method to get the `IUnknown` pointer associated with a given cookie. @@ -214,7 +214,7 @@ Returns the `IUnknown` pointer, or NULL if no matching cookie is found. Call this method to remove an `IUnknown` pointer from the array. -Note: All other elements are unchanged and retain their index and cookie. +All other elements are unchanged and retain their index and cookie. ``` BOOL Remove(DWORD dwCookie); From 6eafc601daf8e41ac5fb83dcd136ddd9509795ac Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Tue, 8 Aug 2023 16:01:19 -0700 Subject: [PATCH 0065/1931] Ammend Add method --- docs/atl/reference/ccomdynamicunkarray-class.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 6753b41013..92a5933b4b 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -74,6 +74,7 @@ Returns the cookie associated with the newly added pointer. Use this cookie to r ### Remarks The position where this item is inserted won't necessarily be directly after the last-inserted item if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. +The array's size might be increased to accomodate for more items. The new size can be obtained via `GetSize()`. ## CComDynamicUnkArray::begin From f5e7dd2c969d8271b7f22d765eb1616759e55c1e Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Tue, 8 Aug 2023 16:11:51 -0700 Subject: [PATCH 0066/1931] Fix grammar --- docs/atl/reference/ccomdynamicunkarray-class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 92a5933b4b..4acaff7d7b 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -74,7 +74,7 @@ Returns the cookie associated with the newly added pointer. Use this cookie to r ### Remarks The position where this item is inserted won't necessarily be directly after the last-inserted item if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. -The array's size might be increased to accomodate for more items. The new size can be obtained via `GetSize()`. +The array's size might be increased to accommodate for more items. Use `GetSize()` to get the new size. ## CComDynamicUnkArray::begin From d8756d9f4445cc2a7e4521791433ebb2747c1455 Mon Sep 17 00:00:00 2001 From: Dmitry Kobets Date: Tue, 8 Aug 2023 16:17:37 -0700 Subject: [PATCH 0067/1931] Fix grammar v2 --- docs/atl/reference/ccomdynamicunkarray-class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/atl/reference/ccomdynamicunkarray-class.md b/docs/atl/reference/ccomdynamicunkarray-class.md index 4acaff7d7b..0c0f142ee6 100644 --- a/docs/atl/reference/ccomdynamicunkarray-class.md +++ b/docs/atl/reference/ccomdynamicunkarray-class.md @@ -74,7 +74,7 @@ Returns the cookie associated with the newly added pointer. Use this cookie to r ### Remarks The position where this item is inserted won't necessarily be directly after the last-inserted item if `Remove()` was previously called on this array. Use the returned cookie to reliably access the inserted pointer. -The array's size might be increased to accommodate for more items. Use `GetSize()` to get the new size. +The array's size might be increased to accommodate more items. Use `GetSize()` to get the new size. ## CComDynamicUnkArray::begin From 146ff9f4998e684e1e7ac177a2c989ad97d76424 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Fri, 11 Aug 2023 12:44:16 -0700 Subject: [PATCH 0068/1931] Update integritycheck-require-signature-check.md --- .../build/reference/integritycheck-require-signature-check.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/build/reference/integritycheck-require-signature-check.md b/docs/build/reference/integritycheck-require-signature-check.md index 33b60c02cb..41e887d9ea 100644 --- a/docs/build/reference/integritycheck-require-signature-check.md +++ b/docs/build/reference/integritycheck-require-signature-check.md @@ -25,9 +25,7 @@ Microsoft has new signing guidance for DLL and executable files linked by using 1. Select the **Configuration Properties** > **Linker** > **Command Line** property page. -1. To build an image which requires digital signature verification to be loaded, add *`/INTEGRITYCHECK`* to the **Additional Options** command line. - -1. To disable the feature, remove the *`/INTEGRITYCHECK`* option. +1. To build an image which requires digital signature verification to be loaded, add *`/INTEGRITYCHECK`* to the **Additional Options** command line. By default, **`/INTEGRITYCHECK`** is off. 1. Choose **OK** to save your changes. From e894f1b02420ab4bb6f9452ead2fabeb1ca1b039 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Thu, 17 Aug 2023 16:14:49 -0700 Subject: [PATCH 0069/1931] update .whatsnew.json for v2 whatsnew tool (#5012) Co-authored-by: TylerMSFT --- .whatsnew.json | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.whatsnew.json b/.whatsnew.json index 6c3360626c..697c37f99d 100644 --- a/.whatsnew.json +++ b/.whatsnew.json @@ -14,6 +14,13 @@ ], "omitPullRequestTitles": false }, + "navigationOptions": { + "maximumNumberOfArticles": 2, + "tocParentNode": " ", + "repoTocFolder": " ", + "indexParentNode": " ", + "repoIndexFolder": " " + }, "areas": [ {"names": ["assembler", "intrinsics"], "heading": "C/C++ compiler intrinsics and assembly language"}, {"names": ["atl", "atl-mfc-shared", "mfc"], "heading": "Active Template Library (ATL), Microsoft Foundation Classes (MFC)"}, From 6840a86f3382e569064e9ce4fd68a345af1d48a5 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 13:21:33 -0700 Subject: [PATCH 0070/1931] update for 17.7 release --- docs/overview/whats-new-cpp-docs.md | 688 +++++++++------------------- 1 file changed, 218 insertions(+), 470 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index 7646a0e689..d46a5f975f 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -1,581 +1,329 @@ --- title: "What's new for the C++ docs" -ms.date: "11/5/2021" +ms.date: "08/22/2023" description: "The new docs and doc updates for the Microsoft C/C++ compiler, ATL/MFC, C runtime, and standard library docs." ms.custom: intro-whats-new monikerRange: '>=msvc-160' --- -# Microsoft C++ docs: What's new for October 2021 +# Microsoft C++ docs: What's new for August 2023 -This article lists major changes to the Microsoft C++ docs July 2021 through October 2021. +This article lists major changes to the Microsoft C++ docs May 2023 through August 2023. These changes correspond to Visual Studio version 17.7. - For what was new in the docs in previous months, see [What's new history](#whats-new-history). - For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). - For the latest C and C++ conformance with ISO standards status, see [C++ conformance improvements in Visual Studio](cpp-conformance-improvements.md). -## Active Template Library (ATL), Microsoft Foundation Classes (MFC) +### Active Template Library (ATL), Microsoft Foundation Classes (MFC) -### Updated articles +**Updated articles** -- [`CSimpleStringT` Class](../atl-mfc-shared/reference/csimplestringt-class.md) - updated code examples and added code example output -- [MFC class hierarchy chart](../mfc/hierarchy-chart.md) - Update MFC hierarchy chart +- [Connection maps](../mfc/reference/connection-maps.md) - Corrected parameter description of `pRefCount` in `AfxConnection(Un)Advise`. +- [`CSimpleStringT` Class](../atl-mfc-shared/reference/csimplestringt-class.md) - Updated code example +- [MFC class hierarchy chart](../mfc/hierarchy-chart.md) - Updated MFC hierarchy chart -## C language +### C language -### New articles +**New articles** - [Generic selection (C11)](../c-language/generic-selection.md) -### Updated articles +**Updated articles** -- [`register` storage-class specifier](../c-language/register-storage-class-specifier.md) - Add C5033 warning -- [C Pragmas](../c-language/c-pragmas.md) - Add system_header pragma documentation -- [C Bit Fields](../c-language/c-bit-fields.md) - Clarify int main(void) example & document MSVC doesn't straddle bit-fields +- [`register` storage-class specifier](../c-language/register-storage-class-specifier.md) - Added C5033 warning +- [C Pragmas](../c-language/c-pragmas.md) - Added `system_header` pragma documentation +- [C Bit Fields](../c-language/c-bit-fields.md) - Clarified `int main(void)` example & documented that MSVC doesn't straddle bit-fields -## C runtime library +### C runtime library -### Updated articles +**Updated articles** -- [CRT Initialization](../c-runtime-library/crt-initialization.md) - Add 16.11 Compiler warnings C5247 and C5248 -- [`rand`](../c-runtime-library/reference/rand.md) - Update code example -- [`wcstombs_s`, `_wcstombs_s_l`](../c-runtime-library/reference/wcstombs-s-wcstombs-s-l.md) - Update code example -- [_get_errno](../c-runtime-library/reference/get-errno.md) - Update code example +- [`_iob`](../c-runtime-library/iob.md) - Clarified value of `_IOB_ENTRIES` across VS versions +- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior in a table for readability +- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior in a table for readability +- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior in a table for readability +- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior in a table for readability +- [`to` functions](../c-runtime-library/to-functions.md) - Fixed code example +- [`strerror_s`, `_strerror_s`, `_wcserror_s`, `__wcserror_s`](../c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s.md) - Clarified behavior +- [`strerror`, `_strerror`, `_wcserror`, `__wcserror`](../c-runtime-library/reference/strerror-strerror-wcserror-wcserror.md) - Clarified behavior +- [`_stat`, `_stat32`, `_stat64`, `_stati64`, `_stat32i64`, `_stat64i32`, `_wstat`, `_wstat32`, `_wstat64`, `_wstati64`, `_wstat32i64`, `_wstat64i32`](../c-runtime-library/reference/stat-functions.md) - Called out changes to `_stat` family of functions across versions of Visual Studio -## C/C++ compiler and tools errors and warnings +### C/C++ compiler intrinsics and assembly language -### New articles +**Updated articles** -- [Command-line error D8049](../error-messages/tool-errors/command-line-error-d8049.md) -- [Compiler Warning C5243](../error-messages/compiler-warnings/c5243.md) -- [Compiler Warning C5247](../error-messages/compiler-warnings/c5247.md) -- [Compiler Warning C5248](../error-messages/compiler-warnings/c5248.md) -- [Compiler Warning (level 1) C5033](../error-messages/compiler-warnings/c5033.md) - -### Updated articles - -- [Command-line errors and warnings](../error-messages/tool-errors/command-line-errors-d8000-through-d9999.md) - new error messages -- [Compiler Warning (level 4) C4710](../error-messages/compiler-warnings/compiler-warning-level-4-c4710.md) - Add C5033 warning -- [Compiler Warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - Add compiler warning C5033, C5243, C5249, C5250, C5247, and C5248. -- [Compiler Error C2666](../error-messages/compiler-errors-2/compiler-error-c2666.md) - Update 16.1 conformance -- [Compiler Warning (level 4) C4702](../error-messages/compiler-warnings/compiler-warning-level-4-c4702.md) - Update warning C4702 -- [Compiler Error C2440](../error-messages/compiler-errors-1/compiler-error-c2440.md) - Add `/Zc:char8_t` compiler option -- [Compiler Error C2760](../error-messages/compiler-errors-2/compiler-error-c2760.md) - New `/Zc:lambda` info -- [Compiler Error C2259](../error-messages/compiler-errors-1/compiler-error-c2259.md) - Update code example - -## C/C++ compiler intrinsics and assembly language - -### New articles - -- [MASM instruction format](../assembler/masm/instruction-format.md) -- [OPTION AVXENCODING](../assembler/masm/option-avxencoding-masm.md) -- [OPTION LANGUAGE](../assembler/masm/option-language-masm.md) - -### Updated articles - -- [MASM for x64 (ml64.exe)](../assembler/masm/masm-for-x64-ml64-exe.md) - Document MASM instruction format including prefixes and option avxencoding -- [Microsoft Macro Assembler reference](../assembler/masm/microsoft-macro-assembler-reference.md) - Document MASM instruction format including prefixes and option avxencoding -- [`OPTION`](../assembler/masm/option-masm.md) - Document MASM instruction format including prefixes and option avxencoding -- [_InterlockedCompareExchange intrinsic functions](../intrinsics/interlockedcompareexchange-intrinsic-functions.md) - Adding missing interlocked intrinsic and fixing another interlock intrinsic return type - -## C/C++ in Visual Studio overview +- [`__umulh`](../intrinsics/umulh.md) - Updated the code example -### New articles +### C/C++ in Visual Studio overview -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2019](../overview/cpp-conformance-improvements-2019.md) -- [What's new for C++ in Visual Studio 2019](../overview/what-s-new-for-cpp-2019.md) +**Updated articles** -### Updated articles +- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Added 17.6 conformance info -- [Overview of C++ development in Visual Studio](../overview/overview-of-cpp-development.md) - Visual Studio 2022 related updates. -- [Install C11 and C17 support in Visual Studio](../overview/install-c17-support.md) - Visual Studio 2022 related updates, C17 updates -- [C++ Tools and Features in Visual Studio Editions](../overview/visual-cpp-tools-and-features-in-visual-studio-editions.md) - Visual Studio 2022 related updates, C17 updates -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Visual Studio 2022 and 16.1 conformance updates -- [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Visual Studio 2022 related updates -- [C and C++ in Visual Studio](../overview/visual-cpp-in-visual-studio.md) - Add missing redist content +### C/C++ projects and build systems -## C/C++ preprocessor reference +**New articles** -### New articles - -- [`system_header` pragma](../preprocessor/system-header-pragma.md) - -### Updated articles - -- [`fenv_access` pragma](../preprocessor/fenv-access.md) - Add floating-point *contractions* info -- [`float_control` pragma](../preprocessor/float-control.md) - Add floating-point *contractions* info -- [`fp_contract` pragma](../preprocessor/fp-contract.md) - Add floating-point *contractions* info -- [Predefined macros](../preprocessor/predefined-macros.md) - Add `__SANITIZE_ADDRESS__` and `_M_FP_CONTRACT` -- [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - Add compiler warning C5243, C5249, C5250, C5247, and C5248 - -## C/C++ projects and build systems - -### New articles - -- [`/Zc:char8_t` (Enable C++20 char8_t type)](../build/reference/zc-char8-t.md) -- [`/Zc:lambda` (Enable updated lambda processor)](../build/reference/zc-lambda.md) -- [`/fsanitize-coverage` (Configure sanitizer coverage)](../build/reference/fsanitize-coverage.md) -- [`abspath` NMAKE function](../build/reference/nmake-function-abspath.md) -- [`basename` NMAKE function](../build/reference/nmake-function-basename.md) -- [`filter`, `filteri` NMAKE functions](../build/reference/nmake-function-filter.md) -- [`filterout`, `filterouti` NMAKE functions](../build/reference/nmake-function-filterout.md) -- [`findstring`, `findstringi` NMAKE functions](../build/reference/nmake-function-findstring.md) -- [`patsubst`, `patsubsti` NMAKE functions](../build/reference/nmake-function-patsubst.md) -- [`strip` NMAKE function](../build/reference/nmake-function-strip.md) -- [`subst`, `substi` NMAKE functions](../build/reference/nmake-function-subst.md) -- [Walkthrough: Build and debug C++ with WSL 2 and Visual Studio 2022](../build/walkthrough-build-debug-wsl2.md) - -### Updated articles - -- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - Fix inconsistencies and add documentation about the "unspecified" architecture feature -- [Clang/LLVM support in Visual Studio CMake projects](../build/clang-support-cmake.md) - Clarified version-specific installation -- [CMake projects in Visual Studio](../build/cmake-projects-in-visual-studio.md) - Fix inconsistencies in CMake docs and add docs on using existing cache without cmake-server -- [/fp (Specify floating-point behavior)](../build/reference/fp-specify-floating-point-behavior.md) - Fix `/fp` sample code -- [`/Og` (Global Optimizations)](../build/reference/og-global-optimizations.md) - Clarify when the **`register`** keyword is ignored -- [`/PROFILE` (Performance Tools Profiler)](../build/reference/profile-performance-tools-profiler.md) - Address `/profile` issues -- [Use the Microsoft C++ toolset from the command line](../build/building-on-the-command-line.md) - Fix MSBuild recommendation & update C/C++ workload name -- [Use an NMAKE macro](../build/reference/using-an-nmake-macro.md) - Add documentation for the new NMAKE functions -- [Commands in a makefile](../build/reference/commands-in-a-makefile.md) - Combine and update NMAKE docs -- [NMAKE makefile contents and features](../build/reference/contents-of-a-makefile.md) - Combine and update NMAKE docs -- [Create a C++ makefile project](../build/reference/creating-a-makefile-project.md) - Combine and update NMAKE docs -- [Define an NMAKE macro](../build/reference/defining-an-nmake-macro.md) - Combine and update NMAKE docs -- [Dot directives](../build/reference/dot-directives.md) - Combine and update NMAKE docs -- [Inference rules](../build/reference/inference-rules.md) - Combine and update NMAKE docs -- [Inline files in a makefile](../build/reference/inline-files-in-a-makefile.md) - Combine and update NMAKE docs -- [Makefile Preprocessing](../build/reference/makefile-preprocessing.md) - Combine and update NMAKE docs -- [NMAKE Reference](../build/reference/nmake-reference.md) - Combine and update NMAKE docs -- [Running NMAKE](../build/reference/running-nmake.md) - Combine and update NMAKE docs -- [Sample Makefile](../build/reference/sample-makefile.md) - Combine and update NMAKE docs -- [Special NMAKE macros](../build/reference/special-nmake-macros.md) - Combine and update NMAKE docs -- [Configuring Programs for Windows XP](../build/configuring-programs-for-windows-xp.md) - Link updates for new redist article -- [`/Zc` (Conformance)](../build/reference/zc-conformance.md) - New `/Zc:lambda` information -- [`/Zc:__cplusplus` (Enable updated `__cplusplus` macro)](../build/reference/zc-cplusplus.md) - New `/Zc:lambda` information -- [CMake predefined build configurations](../build/cmake-predefined-configuration-reference.md) - Fix inconsistencies in CMake docs -- [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](../build/cmake-presets-json-reference.md) - Fix inconsistencies in CMake docs -- [Tutorial: Debug a CMake project on a remote Windows machine](../build/cmake-remote-debugging.md) - Fix inconsistencies in CMake docs -- [`CMakeSettings.json` schema reference](../build/cmakesettings-reference.md) - Fix inconsistencies in CMake docs -- [`launch.vs.json` schema reference (C++)](../build/launch-vs-schema-reference-cpp.md) - add debugInfo macro definitions -- [`/external` (External headers diagnostics)](../build/reference/external-external-headers-diagnostics.md) - Add `system_header` pragma doc -- [DUMPBIN Reference](../build/reference/dumpbin-reference.md) - Setting `PATH` allows `DUMPBIN` to be executed from the command prompt -- [/Qspectre](../build/reference/qspectre.md) - Clarified `/Qspectre` Required Libraries section - -## C++ in Visual Studio - -### Updated articles - -- [Storage classes](../cpp/storage-classes-cpp.md) - Add C5033 warning -- [void (C++)](../cpp/void-cpp.md) - Clarify overall article -- [Labeled statements](../cpp/labeled-statements.md) - Correct labeled statements -- [Brace initialization](../cpp/initializing-classes-and-structs-without-constructors-cpp.md) - Address sanitizer comment location -- [Member Access Control (C++)](../cpp/member-access-control-cpp.md) - Update static member access in example -- [String and character literals (C++)](../cpp/string-and-character-literals-cpp.md) - Updates for C++20 portable **`char8_t`**. -- [Declarations and definitions (C++)](../cpp/declarations-and-definitions-cpp.md) - fix code sample -- [Template Specialization (C++)](../cpp/template-specialization-cpp.md) - update code example - -## C++ in Visual Studio tutorials - -### Updated articles - -- [Create a console calculator in C++](../get-started/tutorial-console-cpp.md) - add Git source control info to the tutorial - -## C++ porting and upgrade guide - -### Updated articles - -- [C++ binary compatibility between Visual Studio versions](../porting/binary-compat-2015-2017.md) - Update version info - -## C++ Standard Library (STL) - -### New articles - -- [`ambiguous_local_time` class](../standard-library/ambiguous-local-time.md) -- [`choose` enum](../standard-library/choose-enum.md) -- [`clock_time_conversion` struct](../standard-library/clock-time-conversion-struct.md) -- [`file_clock` class](../standard-library/file-clock-class.md) -- [`gps_clock` class](../standard-library/gps-clock-class.md) -- [`is_clock` structure](../standard-library/is-clock-struct.md) -- [`last_spec` struct](../standard-library/last-spec-struct.md) -- [`local_info` struct](../standard-library/local-info-struct.md) -- [`local_t` struct](../standard-library/local_t.md) -- [`nonexistent_local_time` class](../standard-library/nonexistent-local-time.md) -- [`sys_info` struct](../standard-library/sys-info-struct.md) -- [`tai_clock` class](../standard-library/tai-clock-class.md) -- [`time_zone_link` class](../standard-library/time-zone-link-class.md) -- [`tzdb_list` class](../standard-library/tzdb-list-class.md) -- [`tzdb` struct](../standard-library/tzdb-struct.md) -- [`utc_clock` class](../standard-library/utc-clock-class.md) -- [`zoned_time` class](../standard-library/zoned-time-class.md) -- [`zoned_traits` struct](../standard-library/zoned-traits-struct.md) - -### Updated articles - -- [`` functions](../standard-library/chrono-functions.md) - added new `` functions -- [``](../standard-library/chrono.md) - added new `` types -- [`duration` class](../standard-library/duration-class.md) - overall article update and linking to related non-member functions -- [Using Insertion Operators and Controlling Format](../standard-library/using-insertion-operators-and-controlling-format.md) - fix `setw` code example -- [`` operators](../standard-library/chrono-operators.md) - Added new C++20 chrono operators -- [`local_info` struct](../standard-library/local-info-struct.md) - updated descriptions for errors -- [`time_zone` class](../standard-library/time-zone-class.md) - article clarifications -- [`any` class](../standard-library/any-class.md) - Added requirements section -- [`` functions](../standard-library/any-functions.md) - Added requirements section -- [`bad_any_cast` class](../standard-library/bad-any-cast-class.md) - Added requirements section -- [domain_error Class](../standard-library/domain-error-class.md) - Improve `` documentation and examples -- [invalid_argument Class](../standard-library/invalid-argument-class.md) - Improve `` documentation and examples -- [length_error Class](../standard-library/length-error-class.md) - Improve `` documentation and examples -- [logic_error Class](../standard-library/logic-error-class.md) - Improve `` documentation and examples -- [out_of_range Class](../standard-library/out-of-range-class.md) - Improve `` documentation and examples -- [overflow_error Class](../standard-library/overflow-error-class.md) - Improve `` documentation and examples -- [range_error Class](../standard-library/range-error-class.md) - Improve `` documentation and examples -- [runtime_error Class](../standard-library/runtime-error-class.md) - Improve `` documentation and examples -- [underflow_error Class](../standard-library/underflow-error-class.md) - Improve `` documentation and examples -- [`filesystem`](../standard-library/filesystem.md) - `` no longer includes `` -- [Output File Stream Member Functions](../standard-library/output-file-stream-member-functions.md) - fixed code example -- [`` functions](../standard-library/bit-functions.md) - Fixed code example -- [``](../standard-library/execution.md) - Mention limits of concurrency -- [`` functions](../standard-library/future-functions.md) - Mention limits of concurrency -- [`thread` Class](../standard-library/thread-class.md) - Mention limits of concurrency - -## Overview of Windows programming in C++ - -### New articles - -- [Microsoft Visual C++ Redistributable Latest Supported Downloads](../windows/latest-supported-vc-redist.md) - -### Updated articles - -- [Walkthrough: Create a traditional Windows Desktop application (C++)](../windows/walkthrough-creating-windows-desktop-applications-cpp.md) - updated examples - -## Read and write code using C++ in Visual Studio - -### New articles - -- [IntelliSense code linter for C++ overview](../ide/cpp-linter-overview.md) -- [`lnt-assignment-equality`](../ide/lnt-assignment-equality.md) -- [`lnt-integer-float-division`](../ide/lnt-integer-float-division.md) -- [`lnt-accidental-copy`](../ide/lnt-accidental-copy.md) -- [`lnt-arithmetic-overflow`](../ide/lnt-arithmetic-overflow.md) -- [`lnt-logical-bitwise-mismatch`](../ide/lnt-logical-bitwise-mismatch.md) -- [`lnt-uninitialized-local`](../ide/lnt-uninitialized-local.md) +- [/jumptablerdata (put switch case jump tables in `.rdata`)](../build/reference/jump-table-rdata.md) -### Updated articles +**Updated articles** -- [`lnt-integer-float-division`](../ide/lnt-integer-float-division.md) - Add Visual Studio 2022 specific config information +- [Advanced Property Page](../build/reference/advanced-property-page.md) - Updates regarding managed projects that target .NET Framework versus .NET +- [`/openmp` (Enable OpenMP Support)](../build/reference/openmp-enable-openmp-2-0-support.md) - Added supported versions +- [Create a C++ console app project](../build/vscpp-step-1-create.md) - Updated for current version of Visual Studio. +- [Build and run a C++ console app project](../build/vscpp-step-2-build.md) - Updated steps to accommodate Visual Studio version differences regarding the location of the debug folder. +- [`/ZW` (Windows Runtime Compilation)](../build/reference/zw-windows-runtime-compilation.md) - Added a note about an incompatibility +- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - Updated supported CMake and *`CMakePresets.json`* versions +- [`/Zc:lambda` (Enable updated lambda processor)](../build/reference/zc-lambda.md) - Added note that it is implied by `/permissive-` +- [C/C++ Property Pages](../build/reference/c-cpp-prop-page.md) - Added description for C language and building ISO standard library modules properties. +- [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Clarified terminology regarding register volatility. -## STL/CLR library reference +### C++ in Visual Studio -### Updated articles +**New articles** -- [.NET programming with C++/CLI](../dotnet/dotnet-programming-with-cpp-cli-visual-cpp.md) - updated instructions for Visual Studio version UI differences +- [Visual Studio Tools for Unreal Engine overview](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-overview.md) +- [Install Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-install.md) +- [Quickstart: Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-quickstart.md) -## Community contributors +**Updated articles** -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide overview](/contribute/) if you'd like to learn how to contribute. -s -- [mohammad-ghasemi-dev](https://github.com/mohammad-ghasemi-dev) (5) -- [Jaiganeshkumaran](https://github.com/Jaiganeshkumaran) - Jaiganesh Kumaran (2) -- [workingjubilee](https://github.com/workingjubilee) - Jubilee (2) -- [adr26](https://github.com/adr26) (1) -- [AlexGuteniev](https://github.com/AlexGuteniev) - Alex Guteniev (1) -- [AzAgarampur](https://github.com/AzAgarampur) - Arush Agarampur (1) -- [d-c-d](https://github.com/d-c-d) - David Dyck (1) -- [onihusube](https://github.com/onihusube) (1) -- [rayz-bee](https://github.com/rayz-bee) - rayz-bee (1) -- [redteamrover](https://github.com/redteamrover) (1) -- [RibShark](https://github.com/RibShark) (1) -- [sauparna](https://github.com/sauparna) - Sauparna Palchowdhury (1) -- [sudoerChris](https://github.com/sudoerChris) - Chris Ho (1) -- [thispsj](https://github.com/thispsj) - PSJ (1) -- [Veverke](https://github.com/Veverke) - Avraham (1) -- [weijiechai](https://github.com/weijiechai) - Chai Wei Jie (1) -- [wmcnamara](https://github.com/wmcnamara) - Weston McNamara (1) -- [ystamant](https://github.com/ystamant) (1) +- [Overview of modules in C++](../cpp/modules-cpp.md) + - Add description for building ISO standard library modules +- [Compiler Limits](../cpp/compiler-limits.md) + - Updated Parameters in macro definition limits +- [How to: Create and Use shared_ptr instances](../cpp/how-to-create-and-use-shared-ptr-instances.md) + - Added a code example to how-to-create-and-use-shared-ptr-instances.md +- [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) + - Added a description for building ISO standard library modules +- [type_info Class](../cpp/type-info-class.md) - Marked `raw_name` Microsoft-specific. -## What's new history +### C++ porting and upgrade guide -The following section provides the previous update of what's new in the Visual Studio docs. +**Updated articles** -### June 2021 +- [Microsoft C/C++ change history 2003 - 2015](../porting/visual-cpp-change-history-2003-2015.md) + - Noted changes to `_stat` family of functions behavior -#### Build insights +### C++ Standard Template Library (STL) reference + +**Updated articles** + +- [`basic_string` Class](../standard-library/basic-string-class.md) - Marked `_Copy_s` Microsoft-specific + +### Code quality **New articles** -- [HeaderUnit class](../build-insights/reference/sdk/cpp-event-data-types/header-unit.md) -- [Module class](../build-insights/reference/sdk/cpp-event-data-types/module.md) -- [PrecompiledHeader class](../build-insights/reference/sdk/cpp-event-data-types/precompiled-header.md) -- [TRANSLATION_UNIT_TYPE enum](../build-insights/reference/sdk/c-event-data-types/translation-unit-type.md) -- [TRANSLATION_UNIT_TYPE_DATA enum](../build-insights/reference/sdk/c-event-data-types/translation-unit-type-data.md) -- [TranslationUnitType class](../build-insights/reference/sdk/cpp-event-data-types/translation-unit-type.md) +- [Warning `C26831`](../code-quality/c26831.md) +- [Warning `C26832`](../code-quality/c26832.md) +- [Warning `C26833`](../code-quality/c26833.md) +- [Warning `C26835`](../code-quality/c26835.md) **Updated articles** -- [C++ Build Insights SDK: event table](../build-insights/reference/sdk/event-table.md) - add new C++ Build Insights events -- [Get started with C++ Build Insights](../build-insights/get-started-with-cpp-build-insights.md) - add new C++ Build Insights events - -#### C language +- [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks +- [Warning C28196](../code-quality/c28196.md) - Clarified behavior +- [Warning C26441](../code-quality/c26441.md) - Clarified behavior +- [Warning C26444](../code-quality/c26444.md) - Clarified behavior +- [Warning C26449](../code-quality/c26449.md) - Clarified behavior +- [Warning C26450](../code-quality/c26450.md) - Clarified behavior +- [Warning C26451](../code-quality/c26451.md) - Clarified behavior +- [Warning C26452](../code-quality/c26452.md) - Clarified behavior +- [Warning C26453](../code-quality/c26453.md) - Clarified behavior +- [Warning C26454](../code-quality/c26454.md) - Clarified behavior +- [Warning C26494](../code-quality/c26494.md) - Clarified behavior +- [Warning C26495](../code-quality/c26495.md) - Clarified behavior +- [Warning C26810](../code-quality/c26810.md) - Clarified behavior +- [Warning C26811](../code-quality/c26811.md) - Clarified behavior +- [Warning C26815](../code-quality/c26815.md) - Clarified behavior +- [Warning C26816](../code-quality/c26816.md) - Clarified behavior +- [Warning C26819](../code-quality/c26819.md) - Clarified behavior +- [Warning C6011](../code-quality/c6011.md) - Clarified behavior +- [Warning C6200](../code-quality/c6200.md) - Clarified behavior +- [Warning C28306](../code-quality/c28306.md) - Clarified behavior +- [Warning C28307](../code-quality/c28307.md) - Clarified behavior +- [Warning C26437](../code-quality/c26437.md) - Clarified behavior +- [Warning C26439](../code-quality/c26439.md) - Clarified behavior +- [Warning C26455](../code-quality/c26455.md) - Clarified behavior +- [Warning C26498](../code-quality/c26498.md) - Clarified behavior +- [Warning C26800](../code-quality/c26800.md) - Clarified behavior +- [Warning C26813](../code-quality/c26813.md) - Clarified behavior +- [Warning C26827](../code-quality/c26827.md) - Clarified behavior +- [Warning C26828](../code-quality/c26828.md) - Clarified behavior +- [Warning C33010](../code-quality/c33010.md) - Clarified behavior + +### Cross platform development **Updated articles** -- [`_Static_assert` keyword and `static_assert` macro (C11)](../c-language/static-assert-c.md) - update the SDK to use -- [Alignment (C11)](../c-language/alignment-c.md) - update the SDK to use -- [Generic selection (C11)](../c-language/generic-selection.md) - update the SDK to use +- [Build an OpenGL ES application on Android and iOS](../cross-platform/build-an-opengl-es-application-on-android-and-ios.md) - Updated documentation to reflect removal of OpenGL -#### C runtime library +### Overview of Windows programming in C++ **Updated articles** -Many articles were updated to prevent the machine translation of code elements. - -- [`_cprintf_p, _cprintf_p_l, _cwprintf_p, _cwprintf_p_l`](../c-runtime-library/reference/cprintf-p-cprintf-p-l-cwprintf-p-cwprintf-p-l.md) - `printf()` rounding behavior change -- [`_cprintf_s, _cprintf_s_l, _cwprintf_s, _cwprintf_s_l`](../c-runtime-library/reference/cprintf-s-cprintf-s-l-cwprintf-s-cwprintf-s-l.md) - `printf()` rounding behavior change -- [`_cprintf, _cprintf_l, _cwprintf, _cwprintf_l`](../c-runtime-library/reference/cprintf-cprintf-l-cwprintf-cwprintf-l.md) - `printf()` rounding behavior change -- [`_fprintf_p, _fprintf_p_l, _fwprintf_p, _fwprintf_p_l`](../c-runtime-library/reference/fprintf-p-fprintf-p-l-fwprintf-p-fwprintf-p-l.md) - `printf()` rounding behavior change -- [`_get_printf_count_output`](../c-runtime-library/reference/get-printf-count-output.md) - `printf()` rounding behavior change -- [`_printf_p, _printf_p_l, _wprintf_p, _wprintf_p_l`](../c-runtime-library/reference/printf-p-printf-p-l-wprintf-p-wprintf-p-l.md) - `printf()` rounding behavior change -- [`_scprintf_p, _scprintf_p_l, _scwprintf_p, _scwprintf_p_l`](../c-runtime-library/reference/scprintf-p-scprintf-p-l-scwprintf-p-scwprintf-p-l.md) - `printf()` rounding behavior change -- [`_scprintf, _scprintf_l, _scwprintf, _scwprintf_l`](../c-runtime-library/reference/scprintf-scprintf-l-scwprintf-scwprintf-l.md) - `printf()` rounding behavior change -- [`_vcprintf_p, _vcprintf_p_l, _vcwprintf_p, _vcwprintf_p_l`](../c-runtime-library/reference/vcprintf-p-vcprintf-p-l-vcwprintf-p-vcwprintf-p-l.md) - `printf()` rounding behavior change -- [`_vcprintf_s, _vcprintf_s_l, _vcwprintf_s, _vcwprintf_s_l`](../c-runtime-library/reference/vcprintf-s-vcprintf-s-l-vcwprintf-s-vcwprintf-s-l.md) - `printf()` rounding behavior change -- [`_vscprintf, _vscprintf_l, _vscwprintf, _vscwprintf_l`](../c-runtime-library/reference/vscprintf-vscprintf-l-vscwprintf-vscwprintf-l.md) - `printf()` rounding behavior change -- [`_vsprintf_p, _vsprintf_p_l, _vswprintf_p, _vswprintf_p_l`](../c-runtime-library/reference/vsprintf-p-vsprintf-p-l-vswprintf-p-vswprintf-p-l.md) - `printf()` rounding behavior change -- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - `printf()` rounding behavior change -- [`errno` constants](../c-runtime-library/errno-constants.md) - improve readability -- [`fprintf`, `_fprintf_l`, `fwprintf`, `_fwprintf_l`](../c-runtime-library/reference/fprintf-fprintf-l-fwprintf-fwprintf-l.md) - `printf()` rounding behavior change -- [`freopen_s`, `_wfreopen_s`](../c-runtime-library/reference/freopen-s-wfreopen-s.md) - new C11 flags -- [`freopen`, `_wfreopen`](../c-runtime-library/reference/freopen-wfreopen.md) - added C11 flags -- [`pow`, `powf`, `powl`](../c-runtime-library/reference/pow-powf-powl.md) - note change to `pow(T,int)` starting in VS 2015 update 1 -- [`printf_s`, `_printf_s_l`, `wprintf_s`, `_wprintf_s_l`](../c-runtime-library/reference/printf-s-printf-s-l-wprintf-s-wprintf-s-l.md) - `printf()` rounding behavior change -- [`setlocale`, `_wsetlocale`](../c-runtime-library/reference/setlocale-wsetlocale.md) - clarified UTF-8 string mode -- [`sprintf`, `_sprintf_l`, `swprintf`, `_swprintf_l`, `__swprintf_l`](../c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l.md) - `printf()` rounding behavior change -- [`cprintf`](../c-runtime-library/reference/cprintf.md) - `printf()` rounding behavior change -- [`fprintf_s, _fprintf_s_l, fwprintf_s, _fwprintf_s_l`](../c-runtime-library/reference/fprintf-s-fprintf-s-l-fwprintf-s-fwprintf-s-l.md) - `printf()` rounding behavior change -- [`sprintf_s, _sprintf_s_l, swprintf_s, _swprintf_s_l`](../c-runtime-library/reference/sprintf-s-sprintf-s-l-swprintf-s-swprintf-s-l.md) - `printf()` rounding behavior change -- [`strcpy_s, wcscpy_s, _mbscpy_s, _mbscpy_s_l`](../c-runtime-library/reference/strcpy-s-wcscpy-s-mbscpy-s.md) - fixed code examples -- [`strncat_s, _strncat_s_l, wcsncat_s, _wcsncat_s_l, _mbsncat_s, _mbsncat_s_l`](../c-runtime-library/reference/strncat-s-strncat-s-l-wcsncat-s-wcsncat-s-l-mbsncat-s-mbsncat-s-l.md) - `printf()` rounding behavior change -- [Type-generic math](../c-runtime-library/tgmath.md) - updated the SDK version to use -- [`vprintf, _vprintf_l, vwprintf, _vwprintf_l`](../c-runtime-library/reference/vprintf-vprintf-l-vwprintf-vwprintf-l.md) - `printf()` rounding behavior change -- [`vsprintf_s, _vsprintf_s_l, vswprintf_s, _vswprintf_s_l`](../c-runtime-library/reference/vsprintf-s-vsprintf-s-l-vswprintf-s-vswprintf-s-l.md) - `printf()` rounding behavior change - -#### C++ in Visual Studio +- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - Noted that VS 2012 reached end of extended support and clarified that the Visual C++ Redistributable for Visual Studio 2015-2022 does not have separate packages for different languages. -**Updated articles** +### Community contributors -- [`_variant_t::operator=`](../cpp/variant-t-operator-equal.md) - add remarks for `operator=` and make the article easier to read. -- [Abstract classes (C++)](../cpp/abstract-classes-cpp.md) - add Microsoft-specific extension information for inline pure virtual destructor -- [Attributes in C++](../cpp/attributes.md) - add missing errors and warnings: C7000-C7999, C4834 -- [char, wchar_t, char8_t, char16_t, char32_t](../cpp/char-wchar-t-char16-t-char32-t.md) - clarified whether char is signed or unsigned +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! Learn how to contribute by following the links under "Get involved" in the [what's new landing page](index.yml). -#### C++ porting and upgrade guide +- [moonlit-melody](https://github.com/moonlit-melody) - melody ![4 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-4-green) +- [AlexGuteniev](https://github.com/AlexGuteniev) - Alex Guteniev ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) +- [MAP233224](https://github.com/MAP233224) - MAP ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) +- [Alice2O3](https://github.com/Alice2O3) - ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [bearerer](https://github.com/bearerer) - ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [bryangalindo](https://github.com/bryangalindo) - Bryan Galindo ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [enricosebastian](https://github.com/enricosebastian) - Enrico Sebastian ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [fsb4000](https://github.com/fsb4000) - Igor Zhukov ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [Passw](https://github.com/Passw) - ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [stephen9357](https://github.com/stephen9357) - ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) + +## What's new history + +This section lists major changes to the Microsoft C++ docs February 2023 through May 2023. These changes correspond to Visual Studio version 17.6. + +For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). + +### C runtime library **Updated articles** -- [Introduction to Microsoft C++ for UNIX Users](../porting/introduction-to-visual-cpp-for-unix-users.md) - Visual Studio 16.10 updates to C17 conformance -- [Visual C++ What's New 2003 through 2015](../porting/visual-cpp-what-s-new-2003-through-2015.md) - note change to `pow(T,int)` starting in VS 2015 update 1 +- [`fopen_s`, `_wfopen_s`](../c-runtime-library/reference/fopen-s-wfopen-s.md) - Clarified some mode modifier flag behaviors. +- [`fopen`, `_wfopen`](../c-runtime-library/reference/fopen-wfopen.md) - Clarified some mode modifier flag behaviors. +- [`_fsopen`, `_wfsopen`](../c-runtime-library/reference/fsopen-wfsopen.md) - Clarified some mode modifier flag behaviors. +- [`setlocale`, `_wsetlocale`](../c-runtime-library/reference/setlocale-wsetlocale.md) - Clarified behavior for invalid arguments. +- [`_getch`, `_getwch`](../c-runtime-library/reference/getch-getwch.md) - Removed statement that the function can't read Ctrl+C. +- [`sprintf`, `_sprintf_l`, `swprintf`, `_swprintf`, `_swprintf_l`, `__swprintf_l`](../c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l.md) - Documented `_swprintf` and how `_CRT_NON_CONFORMING_SWPRINTFS` maps calls to `swprintf` to `_swprintf`. +- [`strtok`, `_strtok_l`, `wcstok`, `_wcstok_l`, `_mbstok`, `_mbstok_l`](../c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l.md) - Noted the non-standard `wcstok()` and how to call it. +- [`wcstombs`, `_wcstombs_l`](../c-runtime-library/reference/wcstombs-wcstombs-l.md) - Added note about UTF-8 support. +- [`fma`, `fmaf`, `fmal`](../c-runtime-library/reference/fma-fmaf-fmal.md) - Corrected the documentation for `fmaf` -#### C/C++ compiler and tools errors and warnings +### C/C++ compiler and tools errors and warnings **New articles** -- [Command-line error D8048](../error-messages/tool-errors/command-line-error-d8048.md) -- [Compiler Error C7510](../error-messages/compiler-errors-2/compiler-error-c7510.md) -- [Compiler Error C7536](../error-messages/compiler-errors-2/compiler-error-c7536.md) -- [Compiler errors C7000 through C7499](../error-messages/compiler-errors-2/compiler-errors-c7000-through-c7499.md) -- [Compiler errors C7500 through C7999](../error-messages/compiler-errors-2/compiler-errors-c7500-through-c7999.md) -- [Compiler Warning (error) C4597](../error-messages/compiler-warnings/c4597.md) -- [Compiler warning (level 1) C4834](../error-messages/compiler-warnings/c4834.md) -- [Compiler Warning (level 1) C5050](../error-messages/compiler-warnings/c5050.md) -- [Compiler warning (level 3) C4698](../error-messages/compiler-warnings/c4698.md) -- [Compiler Warning (level 3) C4768](../error-messages/compiler-warnings/c4768.md) -- [Compiler Warning (level 4) C4841](../error-messages/compiler-warnings/c4841.md) -- [Compiler Warning (level 4) C4843](../error-messages/compiler-warnings/c4843.md) -- [Compiler warning C5037](../error-messages/compiler-warnings/c5037.md) -- [Fatal Error C1090](../error-messages/compiler-errors-1/fatal-error-c1090.md) +- [Compiler error C7688](../error-messages/compiler-errors-2/compiler-error-c7688.md) +- [Compiler warning (level 1, error, off) C5262](../error-messages/compiler-warnings/c5262.md) +- [Compiler warnings (level 1) C5301 and C5302](../error-messages/compiler-warnings/c5301-c5302.md) **Updated articles** -- [Compiler Error C2139](../error-messages/compiler-errors-1/compiler-error-c2139.md) - added some version 2017 diagnostics -- [Compiler Error C2201](../error-messages/compiler-errors-1/compiler-error-c2201.md) - added some version 2017 diagnostics -- [Compiler Error C2276](../error-messages/compiler-errors-1/compiler-error-c2276.md) - update C2276 -- [Compiler Error C2668](../error-messages/compiler-errors-2/compiler-error-c2668.md) - added some version 2017 diagnostics -- [Compiler Error C2855](../error-messages/compiler-errors-2/compiler-error-c2855.md) - add remarks about how to resolve this error -- [Compiler errors C2000 - C3999, C7000 - C7999](../error-messages/compiler-errors-1/compiler-errors-c2000-c3999.md) - add missing errors and warnings: C7000-C7999, C4834 -- [Compiler errors C7500 through C7999](../error-messages/compiler-errors-2/compiler-errors-c7500-through-c7999.md) - added some version 2017 diagnostics; add error C7510; add missing errors and warnings: C7000-C7999, C4834 -- [Compiler Warning (level 1) C4179](../error-messages/compiler-warnings/compiler-warning-level-1-c4179.md) - added some version 2017 diagnostics -- [Compiler Warning (level 1) C5208 and Error C7626](../error-messages/compiler-warnings/c5208.md) - add missing errors and warnings: C7000-C7999, C4834 -- [Compiler Warning (level 4) C4189](../error-messages/compiler-warnings/compiler-warning-level-4-c4189.md) - added some version 2017 diagnostics -- [Compiler Warning C5038](../error-messages/compiler-warnings/c5038.md) - added some version 2017 diagnostics -- [Compiler warnings by compiler version](../error-messages/compiler-warnings/compiler-warnings-by-compiler-version.md) - update Visual Studio 16.10 conformance improvements and new warnings; Add new 16.10 warnings, version info; update version strings for Visual Studio 16.8, 16.9, and 16.10 -- [Compiler warnings C4400 Through C4599](../error-messages/compiler-warnings/compiler-warnings-c4400-through-c4599.md) - added some Visual Studio version 2017 diagnostics -- [Compiler warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - update Visual Studio 16.10 conformance improvements and new warnings; add new 16.10 warnings, version info; added some version 2017 diagnostics; add missing errors and warnings: C7000 - C7999, C4834 -- [Vectorizer and parallelizer messages](../error-messages/tool-errors/vectorizer-and-parallelizer-messages.md) - add vectorizer failure reason 505; add 1204 reason code - -#### C/C++ compiler intrinsics and assembly language +- [Compiler Warnings by compiler version](../error-messages/compiler-warnings/compiler-warnings-by-compiler-version.md) - Updated with changes for VS 17.5 +- [Compiler warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - Updated with changes for VS 17.5 -**Updated articles** +### C/C++ compiler intrinsics and assembly language -- [Microsoft Macro Assembler BNF Grammar](../assembler/masm/masm-bnf-grammar.md) - cleanup formatting and machine translation issues +### C/C++ in Visual Studio overview -#### C/C++ in Visual Studio overview +**Updated articles** -**New articles** +- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Updated for VS 17.5 changes +- [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Update with changes for VS 17.5 +- [What's new for C++ in Visual Studio 2022](../overview/what-s-new-for-visual-cpp-in-visual-studio.md) - Update with changes for VS 17.5 -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2017](../overview/cpp-conformance-improvements-2017.md) -- [Microsoft C++ docs: What's new for Visual Studio 16.8](../overview/whats-new-cpp-docs.md) -- [What's new for C++ in Visual Studio 2017](../overview/what-s-new-for-cpp-2017.md) +### C/C++ preprocessor reference **Updated articles** -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2017](../overview/cpp-conformance-improvements-2017.md) - added version 2017 diagnostics -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2019](../overview/cpp-conformance-improvements.md) - Visual Studio 16.10 updates to C17 conformance; update 16.10 conformance improvements and new warnings; add error C7510; add missing errors and warnings: C7000 - C7999, C4834; update conformance docs for 16.9 -- [C++ in Visual Studio](../overview/visual-cpp-in-visual-studio.md) - Visual Studio 16.10 updates to C17 conformance -- [Install C11 and C17 support in Visual Studio](../overview/install-c17-support.md) - Visual Studio 16.10 updates to C17 conformance -- [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Visual Studio 16.10 updates to C17 conformance; update conformance table for Visual Studio 16.10 and Visual Studio 16.9 -- [Microsoft C++ docs: What's new for Visual Studio 16.8](../overview/whats-new-cpp-docs.md) - Visual Studio 16.10 updates to C17 conformance -- [What's new for C++ in Visual Studio 2017](../overview/what-s-new-for-cpp-2017.md) - Visual Studio 16.10 updates to C17 conformance; update Visual Studio 16.9 release conformance docs +- [Predefined macros](../preprocessor/predefined-macros.md) - Update _MSC_VER values for 17.3, 17.4, and 17.5 +- [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - Update with changes for VS 17.5 -#### C/C++ preprocessor reference +### C/C++ projects and build systems **Updated articles** -- [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - update Visual Studio 16.10 conformance improvements and new warnings; added some version 2017 diagnostics -- [Predefined macros](../preprocessor/predefined-macros.md) - add new Visual Studio 16.10 warnings, version info; update version strings for Visual Studio 16.8, 16.9, and 16.10 +- [Use the Microsoft C++ toolset from the command line](../build/building-on-the-command-line.md) - Improved command-line instructions +- [Walkthrough: Compiling a C++/CLI Program on the Command Line](../build/walkthrough-compiling-a-cpp-cli-program-on-the-command-line.md) - Improved command-line instructions +- [Walkthrough: Compiling a C++/CX Program on the Command Line](../build/walkthrough-compiling-a-cpp-cx-program-on-the-command-line.md) - Improved dev command line instructions +- [`/Gs` (Control stack checking calls)](../build/reference/gs-control-stack-checking-calls.md) - Updated max value for /Gs +- [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Corrected HFA return values +- [ARM64 exception handling](../build/arm64-exception-handling.md) - In the compressed format, PAC is identified by CR=2, not 3. +- [Reference: vcperf commands](../build-insights/reference/vcperf-commands.md) - Updated which commands require administrative privileges. -#### C/C++ projects and build systems +### C++ in Visual Studio -**New articles** +**Updated articles** -- [`/external` (External headers diagnostics)](../build/reference/external-external-headers-diagnostics.md) -- [`/headerName` (Build a header unit from the specified header)](../build/reference/headername.md) -- [`/sourceDependencies:directives` (List module and header unit dependencies)](../build/reference/sourcedependencies-directives.md) -- [`CMakePresets.json` and `CMakeUserPresets.json` Microsoft vendor maps](../build/cmake-presets-json-reference.md) -- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) -- [HeaderUnit class](../build-insights/reference/sdk/cpp-event-data-types/header-unit.md) -- [Module class](../build-insights/reference/sdk/cpp-event-data-types/module.md) -- [PrecompiledHeader class](../build-insights/reference/sdk/cpp-event-data-types/precompiled-header.md) -- [TRANSLATION_UNIT_TYPE enum](../build-insights/reference/sdk/c-event-data-types/translation-unit-type.md) -- [TRANSLATION_UNIT_TYPE_DATA enum](../build-insights/reference/sdk/c-event-data-types/translation-unit-type-data.md) -- [TranslationUnitType class](../build-insights/reference/sdk/cpp-event-data-types/translation-unit-type.md) -- [Walkthrough: Build and import header units in Microsoft Visual C++](../build/walkthrough-header-units.md) -- [Walkthrough: Import STL libraries as header units](../build/walkthrough-import-stl-header-units.md) +- [Transporting exceptions between threads](../cpp/transporting-exceptions-between-threads.md) - fix section about types of exception handling +- [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) - Updated wording and fixed problems with the path and suggested directory location. -**Updated articles** +### C++ in Visual Studio tutorials -- [/experimental:module (Enable module support)](../build/reference/experimental-module.md) - new content for header-units -- [/Qspectre](../build/reference/qspectre.md) - update for VS 2019 -- [/Y (precompiled headers)](../build/reference/y-precompiled-headers.md) - new content for header-units -- [`/analyze` (Code analysis)](../build/reference/analyze-code-analysis.md) - update with up-to-date options list, add more information, and restructure for better organization of related options -- [`/await` (Enable coroutine support)](../build/reference/await-enable-coroutine-support.md) - add `/await:strict` for Visual Studio 16.10 -- [`/clr` (Common Language Runtime Compilation)](../build/reference/clr-common-language-runtime-compilation.md) - include version for support of `/clr:netcore` option -- [`/exportHeader` (Create header units)](../build/reference/module-exportheader.md) - add new content related to header-units -- [`/external` (External headers diagnostics)](../build/reference/external-external-headers-diagnostics.md) - `/external` not experimental in Visual Studio 16.10 -- [`/F` (Set Stack Size)](../build/reference/f-set-stack-size.md) - update for VS 2019 -- [`/FC` (Full path of source code file in diagnostics)](../build/reference/fc-full-path-of-source-code-file-in-diagnostics.md) - Classify behavior by version. -- [`/GL` (Whole program optimization)](../build/reference/gl-whole-program-optimization.md) - fix loc issue in /GL docs -- [`/headerUnit` (Use header unit IFC)](../build/reference/headerunit.md) - new content for header-units -- [`/INTEGRITYCHECK` (Require signature check)](../build/reference/integritycheck-require-signature-check.md) - updated signing guidance for `integritycheck` binaries -- [`/openmp` (Enable OpenMP Support)](../build/reference/openmp-enable-openmp-2-0-support.md) - add /openmp:llvm compiler switch docs -- [`/reference` (Use named module IFC)](../build/reference/module-reference.md) - new content for header-units -- [`/sourceDependencies` (List all source-level dependencies)](../build/reference/sourcedependencies.md) - new content for header-units -- [`/std` (Specify Language Standard Version)](../build/reference/std-specify-language-standard-version.md) - Visual Studio 16.10 updates to C17 conformance -- [`/translateInclude` (Translate include directives into import directives)](../build/reference/translateinclude.md) - new content for header-units -- [Advanced Property Page](../build/reference/advanced-property-page.md) - add Windows Desktop Compatible property for Visual Studio 16.10; Add LLVM toolset version option for Visual Studio 16.9 -- [ARM Exception Handling](../build/arm-exception-handling.md) - fix `ComputeXdataSize` samples for ARM/ARM64 -- [ARM64 exception handling](../build/arm64-exception-handling.md) - fix `ComputeXdataSize` samples for ARM/ARM64 -- [C++ Build Insights SDK: event table](../build-insights/reference/sdk/event-table.md) - add New C++ Build Insights Events to documentation -- [Clang/LLVM support in Visual Studio projects](../build/clang-support-msbuild.md) - add LLVM toolset version option for Visual Studio 16.9; update clang-support-msbuild.md -- [CMake projects in Visual Studio](../build/cmake-projects-in-visual-studio.md) - add advanced details about using CMake file-api -- [Compiler options listed alphabetically](../build/reference/compiler-options-listed-alphabetically.md) - new content for header-units -- [Compiler options listed by category](../build/reference/compiler-options-listed-by-category.md) - new content for header-units -- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - improve readability -- [General Property Page (Project)](../build/reference/general-property-page-project.md) - add Windows Desktop Compatible property for Visual Studio 16.10 -- [Get started with C++ Build Insights](../build-insights/get-started-with-cpp-build-insights.md) - add New C++ Build Insights Events to documentation -- [How to: Modify the Target Framework and Platform Toolset](../build/how-to-modify-the-target-framework-and-platform-toolset.md) - improve readability -- [Open Folder support for C++ build systems in Visual Studio](../build/open-folder-projects-cpp.md) - fix CppProperties.json MinGW-w64 contents -- [Unicode support in the compiler and linker](../build/reference/unicode-support-in-the-compiler-and-linker.md) - add info about how to save using a different encoding -- [Use the Microsoft C++ toolset from the command line](../build/building-on-the-command-line.md) - updated for VS 2019 -- [Walkthrough: Compile a C program on the command line](../build/walkthrough-compile-a-c-program-on-the-command-line.md) - Visual Studio 16.10 updates to C17 conformance -- [Walkthrough: Compiling a Native C++ Program on the Command Line](../build/walkthrough-compiling-a-native-cpp-program-on-the-command-line.md) - clarified notepad behavior when opening source file - -#### C++ Standard Library (STL) reference +**Updated articles** -**New articles** +- [Create a console calculator in C++](../get-started/tutorial-console-cpp.md) - updated screenshots and updated the result and exception error format. -- [``](../standard-library/ranges.md) -- [`day` class](../standard-library/day-class.md) -- [`month_day_last` class](../standard-library/month-day-last-class.md) -- [`month_day` class](../standard-library/month-day-class.md) -- [`month_weekday_last` class](../standard-library/month-weekday-last-class.md) -- [`month_weekday` class](../standard-library/month-weekday-class.md) -- [`year_month` class](../standard-library/year-month-class.md) +### C++ Standard Template Library (STL) reference **Updated articles** -- [`bitset` class](../standard-library/bitset-class.md) - improve readability -- [`vector` class](../standard-library/vector-class.md) - fix typo in code sample +- [`directory_iterator` class](../standard-library/directory-iterator-class.md) - remove experimental -#### Code quality +### Code quality **New articles** -- [C6389: MARK_INTERNAL_OR_MISSING_COMMON_DECL](../code-quality/c6389.md) +- [Warning C6030](../code-quality/c6030.md) +- [Warning C6065](../code-quality/c6065.md) **Updated articles** -- [C6031](../code-quality/c6031.md) - add note about ignoring a function's return value -- [C26432 DEFINE_OR_DELETE_SPECIAL_OPS](../code-quality/c26432.md) - update code examples -- [C26497 USE_CONSTEXPR_FOR_FUNCTION](../code-quality/c26497.md) - add note about when warning won't be issued +- [Warning C6001](../code-quality/c6001.md) - Added examples explaining initialization heuristics for C6001 +- [Best practices and examples (SAL)](../code-quality/best-practices-and-examples-sal.md) - fix SAL annotation +- [Warning C26441](../code-quality/c26441.md) - SA diagnostic updates part 1 +- [Warning C28213](../code-quality/c28213.md) - SA diagnostic updates part 1 +- [Warning C6029](../code-quality/c6029.md) - Updated description. +- [Warning C6064](../code-quality/c6064.md) - Clarified example. +- [Warning C6101](../code-quality/c6101.md) - Clarified text. +- [Warning C6217](../code-quality/c6217.md) - Clarified text. -#### Linux with C++ in Visual Studio +### Linux with C++ in Visual Studio **Updated articles** -- [Connect to your target Linux system in Visual Studio](../linux/connect-to-your-remote-linux-computer.md) - add section about host key verification -- [ConnectionManager reference](../linux/connectionmanager-reference.md) - add note about host key fingerprint flags added in Visual Studio 16.10. +- [Linux development with C++](../linux/index.yml) - [Bulk] Update author fields in cpp-docs-pr +- [Connect to your target Linux system in Visual Studio](../linux/connect-to-your-remote-linux-computer.md) - Added note regarding `ssh-keygen`. +### Overview of Windows programming in C++ + +**Updated articles** -#### Overview of Windows programming in C++ +- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - explained why there aren't version numbers listed for VS 2015-2022 + +### Read and write code using C++ in Visual Studio **Updated articles** -- [Determining Which DLLs to Redistribute](../windows/determining-which-dlls-to-redistribute.md) - updated for Visual Studio 2019 +- [Add a class from an ActiveX control](../ide/adding-a-class-from-an-activex-control-visual-cpp.md) - Clarified which project types the wizard applies to. +- [Walkthrough: Working with Projects and Solutions (C++)](../ide/walkthrough-working-with-projects-and-solutions-cpp.md) - Updated for Visual Studio 17.5 -#### Parallel programming in C++ in Visual Studio +### STL/CLR library reference **Updated articles** -- [C++ AMP Overview](../parallel/amp/cpp-amp-overview.md) - add note about C++ AMP library deprecation -- [Walkthrough: Debugging a C++ AMP application](../parallel/amp/walkthrough-debugging-a-cpp-amp-application.md) - fixed code sample - -#### Community contributors - -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide overview](/contribute/) if you'd like to learn how to contribute. - -- [0xbadfca11](https://github.com/0xbadfca11) (1) -- [bclehmann](https://github.com/bclehmann) - Benjamin Lehmann (1) -- [Brian-Taylor8](https://github.com/Brian-Taylor8) (1) -- [cartwrightluke](https://github.com/cartwrightluke) (2) -- [ccawley2011](https://github.com/ccawley2011) - Cameron Cawley (1) -- [EddieBreeveld](https://github.com/EddieBreeveld) - Edward Breeveld (1) -- [FrankAtHexagon](https://github.com/FrankAtHexagon) - Frank Edwards (1) -- [fsb4000](https://github.com/fsb4000) - Igor Zhukov (1) -- [Jaiganeshkumaran](https://github.com/Jaiganeshkumaran) - Jaiganesh Kumaran (2) -- [jayvient](https://github.com/jayvient) - Jayvien (1) -- [KishkinJ10](https://github.com/KishkinJ10) (1) -- [kokosxD](https://github.com/kokosxD) - kokos (1) -- [langemol](https://github.com/langemol) - Jacco Mol (1) -- [MUzairS15](https://github.com/MUzairS15) (1) -- [nadavsu](https://github.com/nadavsu) - Nadav (1) -- [NegiAkash890](https://github.com/NegiAkash890) - Akash Negi (1) -- [pjessesco](https://github.com/pjessesco) - Jino Park (1) -- [pramodkirchki](https://github.com/pramodkirchki) (1) -- [Radfordhound](https://github.com/Radfordhound) - Graham Scott (1) -- [sapant-msft](https://github.com/sapant-msft) (1) -- [sebgod](https://github.com/sebgod) - Sebastian Godelet (1) -- [seedkar1](https://github.com/seedkar1) (1) -- [ShamanCoder](https://github.com/ShamanCoder) (1) -- [sheila-stewart](https://github.com/sheila-stewart) (1) -- [softmac](https://github.com/softmac) (1) -- [Thieum](https://github.com/Thieum) - Matthieu Penant (2) -- [tjs137](https://github.com/tjs137) (1) -- [urmyfaith](https://github.com/urmyfaith) - zx (1) -- [ValZapod](https://github.com/ValZapod) - Valerii Zapodovnikov (1) -- [westinn](https://github.com/westinn) - Nicolas Westin (1) +- [`queue` (STL/CLR)](../dotnet/queue-stl-clr.md) - fixed compilation error in code examples. + +## Community contributors + +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! Learn how to contribute by following the links under "Get involved" in the [what's new landing page](index.yml). + +- [fsb4000](https://github.com/fsb4000) - Igor Zhukov ![3 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-3-green) +- [fjh1997](https://github.com/fjh1997) - FunnyBiu ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) +- [X0RW3LL](https://github.com/X0RW3LL) - ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) +- [EddieBreeveld](https://github.com/EddieBreeveld) - Edward Breeveld ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [fkelava](https://github.com/fkelava) - Fran 'peppy' Kelava ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [JustaSimpleUser](https://github.com/JustaSimpleUser) - Centurion Maximus ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [lkundrak](https://github.com/lkundrak) - Lubomir Rintel ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [LuShuchen](https://github.com/LuShuchen) - ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [martinschonger](https://github.com/martinschonger) - Martin Schonger ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [matbech](https://github.com/matbech) - Mathias Berchtold ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [NADIRHUSSAIN11](https://github.com/NADIRHUSSAIN11) - Nadir Hussain ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [peanutsjamjam](https://github.com/peanutsjamjam) - Atsushi SUGAWARA ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [RAJU2529](https://github.com/RAJU2529) - VARADHARAJAN K ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [robert-andrzejuk](https://github.com/robert-andrzejuk) - Robert Andrzejuk ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [science-enthusiast](https://github.com/science-enthusiast) - Hari ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [terrymah](https://github.com/terrymah) - Terry Mahaffey ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [vtjnash](https://github.com/vtjnash) - Jameson Nash ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [XuhuaHuang](https://github.com/XuhuaHuang) - XuhuaHuang ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) +- [YoniFeng](https://github.com/YoniFeng) - Yoni Feng ![1 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-1-green) \ No newline at end of file From 78310ab66eacae06316ef6174336f19daa368ae1 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 14:01:19 -0700 Subject: [PATCH 0071/1931] fix links --- docs/overview/whats-new-cpp-docs.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index d46a5f975f..e9583b1000 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -74,7 +74,7 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu - [Build and run a C++ console app project](../build/vscpp-step-2-build.md) - Updated steps to accommodate Visual Studio version differences regarding the location of the debug folder. - [`/ZW` (Windows Runtime Compilation)](../build/reference/zw-windows-runtime-compilation.md) - Added a note about an incompatibility - [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - Updated supported CMake and *`CMakePresets.json`* versions -- [`/Zc:lambda` (Enable updated lambda processor)](../build/reference/zc-lambda.md) - Added note that it is implied by `/permissive-` +- [`/Zc:lambda` (Enable updated lambda processor)](../build/reference/zc-lambda.md) - Added note that `/permissive-` implies `/Zc:lambda`. - [C/C++ Property Pages](../build/reference/c-cpp-prop-page.md) - Added description for C language and building ISO standard library modules properties. - [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Clarified terminology regarding register volatility. @@ -82,9 +82,9 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **New articles** -- [Visual Studio Tools for Unreal Engine overview](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-overview.md) -- [Install Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-install.md) -- [Quickstart: Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-quickstart.md) +- [Visual Studio Tools for Unreal Engine overview](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-overview) +- [Install Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-install) +- [Quickstart: Visual Studio Tools for Unreal Engine](/visualstudio/gamedev/unreal/get-started/vs-tools-unreal-quickstart) **Updated articles** @@ -163,11 +163,11 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** -- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - Noted that VS 2012 reached end of extended support and clarified that the Visual C++ Redistributable for Visual Studio 2015-2022 does not have separate packages for different languages. +- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - Noted that VS 2012 reached end of extended support and clarified that the Visual C++ Redistributable for Visual Studio 2015-2022 doesn't have separate packages for different languages. ### Community contributors -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! Learn how to contribute by following the links under "Get involved" in the [what's new landing page](index.yml). +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](https://learn.microsoft.com/contribute) if you'd like to learn how to contribute. - [moonlit-melody](https://github.com/moonlit-melody) - melody ![4 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-4-green) - [AlexGuteniev](https://github.com/AlexGuteniev) - Alex Guteniev ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) @@ -196,7 +196,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [`setlocale`, `_wsetlocale`](../c-runtime-library/reference/setlocale-wsetlocale.md) - Clarified behavior for invalid arguments. - [`_getch`, `_getwch`](../c-runtime-library/reference/getch-getwch.md) - Removed statement that the function can't read Ctrl+C. - [`sprintf`, `_sprintf_l`, `swprintf`, `_swprintf`, `_swprintf_l`, `__swprintf_l`](../c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l.md) - Documented `_swprintf` and how `_CRT_NON_CONFORMING_SWPRINTFS` maps calls to `swprintf` to `_swprintf`. -- [`strtok`, `_strtok_l`, `wcstok`, `_wcstok_l`, `_mbstok`, `_mbstok_l`](../c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l.md) - Noted the non-standard `wcstok()` and how to call it. +- [`strtok`, `_strtok_l`, `wcstok`, `_wcstok_l`, `_mbstok`, `_mbstok_l`](../c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l.md) - Noted the nonstandard `wcstok()` and how to call it. - [`wcstombs`, `_wcstombs_l`](../c-runtime-library/reference/wcstombs-wcstombs-l.md) - Added note about UTF-8 support. - [`fma`, `fmaf`, `fmal`](../c-runtime-library/reference/fma-fmaf-fmal.md) - Corrected the documentation for `fmaf` @@ -265,6 +265,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua **New articles** +- [Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues](../cpp/sanitizers/asan-continue-on-error.md) - [Warning C6030](../code-quality/c6030.md) - [Warning C6065](../code-quality/c6065.md) @@ -306,7 +307,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua ## Community contributors -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! Learn how to contribute by following the links under "Get involved" in the [what's new landing page](index.yml). +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](https://learn.microsoft.com/contribute) if you'd like to learn how to contribute. - [fsb4000](https://github.com/fsb4000) - Igor Zhukov ![3 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-3-green) - [fjh1997](https://github.com/fjh1997) - FunnyBiu ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) From b2ffe8675777c810bbd3dd881ee1e6c8cfb592a0 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 14:07:46 -0700 Subject: [PATCH 0072/1931] fix links --- docs/overview/whats-new-cpp-docs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index e9583b1000..a49b953c52 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -167,7 +167,7 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu ### Community contributors -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](https://learn.microsoft.com/contribute) if you'd like to learn how to contribute. +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](/contribute) if you'd like to learn how to contribute. - [moonlit-melody](https://github.com/moonlit-melody) - melody ![4 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-4-green) - [AlexGuteniev](https://github.com/AlexGuteniev) - Alex Guteniev ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) @@ -265,7 +265,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua **New articles** -- [Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues](../cpp/sanitizers/asan-continue-on-error.md) +- [Walkthrough: Use Address Sanitizer Continue On Error to find memory safety issues](../sanitizers/asan-continue-on-error.md) - [Warning C6030](../code-quality/c6030.md) - [Warning C6065](../code-quality/c6065.md) @@ -307,7 +307,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua ## Community contributors -The following people contributed to the C++, C, and Assembler docs during this period. Thank you! The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](https://learn.microsoft.com/contribute) if you'd like to learn how to contribute. +The following people contributed to the C++, C, and Assembler docs during this period. Thank you! The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](/contribute) if you'd like to learn how to contribute. - [fsb4000](https://github.com/fsb4000) - Igor Zhukov ![3 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-3-green) - [fjh1997](https://github.com/fjh1997) - FunnyBiu ![2 pull requests.](https://img.shields.io/badge/Merged%20Pull%20Requests-2-green) From b61b8768787a6306fdcafb18d790f0d132734f86 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 14:35:23 -0700 Subject: [PATCH 0073/1931] Normalize line endings --- docs/overview/whats-new-cpp-docs.md | 229 ++++++++++++++-------------- 1 file changed, 112 insertions(+), 117 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index a49b953c52..01c9d16c3b 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -14,71 +14,71 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu - For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). - For the latest C and C++ conformance with ISO standards status, see [C++ conformance improvements in Visual Studio](cpp-conformance-improvements.md). -### Active Template Library (ATL), Microsoft Foundation Classes (MFC) +## Active Template Library (ATL), Microsoft Foundation Classes (MFC) **Updated articles** - [Connection maps](../mfc/reference/connection-maps.md) - Corrected parameter description of `pRefCount` in `AfxConnection(Un)Advise`. -- [`CSimpleStringT` Class](../atl-mfc-shared/reference/csimplestringt-class.md) - Updated code example -- [MFC class hierarchy chart](../mfc/hierarchy-chart.md) - Updated MFC hierarchy chart +- [`CSimpleStringT` Class](../atl-mfc-shared/reference/csimplestringt-class.md) - Updated code example. +- [MFC class hierarchy chart](../mfc/hierarchy-chart.md) - Updated MFC hierarchy chart. -### C language +## C language **New articles** -- [Generic selection (C11)](../c-language/generic-selection.md) +- [Generic selection (C11)](../c-language/generic-selection.md). **Updated articles** -- [`register` storage-class specifier](../c-language/register-storage-class-specifier.md) - Added C5033 warning -- [C Pragmas](../c-language/c-pragmas.md) - Added `system_header` pragma documentation -- [C Bit Fields](../c-language/c-bit-fields.md) - Clarified `int main(void)` example & documented that MSVC doesn't straddle bit-fields +- [`register` storage-class specifier](../c-language/register-storage-class-specifier.md) - Added C5033 warning. +- [C Pragmas](../c-language/c-pragmas.md) - Added `system_header` pragma documentation. +- [C Bit Fields](../c-language/c-bit-fields.md) - Clarified `int main(void)` example & documented that MSVC doesn't straddle bit-fields. -### C runtime library +## C runtime library **Updated articles** -- [`_iob`](../c-runtime-library/iob.md) - Clarified value of `_IOB_ENTRIES` across VS versions -- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior in a table for readability -- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior in a table for readability -- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior in a table for readability -- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior in a table for readability -- [`to` functions](../c-runtime-library/to-functions.md) - Fixed code example -- [`strerror_s`, `_strerror_s`, `_wcserror_s`, `__wcserror_s`](../c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s.md) - Clarified behavior -- [`strerror`, `_strerror`, `_wcserror`, `__wcserror`](../c-runtime-library/reference/strerror-strerror-wcserror-wcserror.md) - Clarified behavior -- [`_stat`, `_stat32`, `_stat64`, `_stati64`, `_stat32i64`, `_stat64i32`, `_wstat`, `_wstat32`, `_wstat64`, `_wstati64`, `_wstat32i64`, `_wstat64i32`](../c-runtime-library/reference/stat-functions.md) - Called out changes to `_stat` family of functions across versions of Visual Studio +- [`_iob`](../c-runtime-library/iob.md) - Clarified value of `_IOB_ENTRIES` across VS versions. +- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior in a table for readability. +- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior in a table for readability. +- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior in a table for readability. +- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior in a table for readability. +- [`to` functions](../c-runtime-library/to-functions.md) - Fixed code example. +- [`strerror_s`, `_strerror_s`, `_wcserror_s`, `__wcserror_s`](../c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s.md) - Clarified behavior. +- [`strerror`, `_strerror`, `_wcserror`, `__wcserror`](../c-runtime-library/reference/strerror-strerror-wcserror-wcserror.md) - Clarified behavior. +- [`_stat`, `_stat32`, `_stat64`, `_stati64`, `_stat32i64`, `_stat64i32`, `_wstat`, `_wstat32`, `_wstat64`, `_wstati64`, `_wstat32i64`, `_wstat64i32`](../c-runtime-library/reference/stat-functions.md) - Called out changes to `_stat` family of functions across versions of Visual Studio. -### C/C++ compiler intrinsics and assembly language +## C/C++ compiler intrinsics and assembly language **Updated articles** -- [`__umulh`](../intrinsics/umulh.md) - Updated the code example +- [`__umulh`](../intrinsics/umulh.md) - Updated the code example. -### C/C++ in Visual Studio overview +## C/C++ in Visual Studio overview **Updated articles** -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Added 17.6 conformance info +- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Added 17.6 conformance info. -### C/C++ projects and build systems +## C/C++ projects and build systems **New articles** -- [/jumptablerdata (put switch case jump tables in `.rdata`)](../build/reference/jump-table-rdata.md) +- [/jumptablerdata (put switch case jump tables in `.rdata`)](../build/reference/jump-table-rdata.md). **Updated articles** -- [Advanced Property Page](../build/reference/advanced-property-page.md) - Updates regarding managed projects that target .NET Framework versus .NET -- [`/openmp` (Enable OpenMP Support)](../build/reference/openmp-enable-openmp-2-0-support.md) - Added supported versions +- [Advanced Property Page](../build/reference/advanced-property-page.md) - Updates regarding managed projects that target .NET Framework versus .NET. +- [`/openmp` (Enable OpenMP Support)](../build/reference/openmp-enable-openmp-2-0-support.md) - Added supported versions. - [Create a C++ console app project](../build/vscpp-step-1-create.md) - Updated for current version of Visual Studio. - [Build and run a C++ console app project](../build/vscpp-step-2-build.md) - Updated steps to accommodate Visual Studio version differences regarding the location of the debug folder. -- [`/ZW` (Windows Runtime Compilation)](../build/reference/zw-windows-runtime-compilation.md) - Added a note about an incompatibility -- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - Updated supported CMake and *`CMakePresets.json`* versions +- [`/ZW` (Windows Runtime Compilation)](../build/reference/zw-windows-runtime-compilation.md) - Added a note about an incompatibility. +- [Configure and build with CMake Presets in Visual Studio](../build/cmake-presets-vs.md) - Updated supported CMake and *`CMakePresets.json`* versions. - [`/Zc:lambda` (Enable updated lambda processor)](../build/reference/zc-lambda.md) - Added note that `/permissive-` implies `/Zc:lambda`. - [C/C++ Property Pages](../build/reference/c-cpp-prop-page.md) - Added description for C language and building ISO standard library modules properties. - [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Clarified terminology regarding register volatility. -### C++ in Visual Studio +## C++ in Visual Studio **New articles** @@ -88,30 +88,25 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** -- [Overview of modules in C++](../cpp/modules-cpp.md) - - Add description for building ISO standard library modules -- [Compiler Limits](../cpp/compiler-limits.md) - - Updated Parameters in macro definition limits -- [How to: Create and Use shared_ptr instances](../cpp/how-to-create-and-use-shared-ptr-instances.md) - - Added a code example to how-to-create-and-use-shared-ptr-instances.md -- [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) - - Added a description for building ISO standard library modules +- [Overview of modules in C++](../cpp/modules-cpp.md) - Add description for building ISO standard library modules. +- [Compiler Limits](../cpp/compiler-limits.md) - Updated Parameters in macro definition limits. +- [How to: Create and Use shared_ptr instances](../cpp/how-to-create-and-use-shared-ptr-instances.md) - Added a code example. +- [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) - Added a description for building ISO standard library modules. - [type_info Class](../cpp/type-info-class.md) - Marked `raw_name` Microsoft-specific. -### C++ porting and upgrade guide +## C++ porting and upgrade guide **Updated articles** -- [Microsoft C/C++ change history 2003 - 2015](../porting/visual-cpp-change-history-2003-2015.md) - - Noted changes to `_stat` family of functions behavior +- [Microsoft C/C++ change history 2003 - 2015](../porting/visual-cpp-change-history-2003-2015.md)- Noted changes to `_stat` family of functions behavior. -### C++ Standard Template Library (STL) reference +## C++ Standard Template Library (STL) reference **Updated articles** -- [`basic_string` Class](../standard-library/basic-string-class.md) - Marked `_Copy_s` Microsoft-specific +- [`basic_string` Class](../standard-library/basic-string-class.md) - Marked `_Copy_s` Microsoft-specific. -### Code quality +## Code quality **New articles** @@ -122,44 +117,44 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** -- [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks -- [Warning C28196](../code-quality/c28196.md) - Clarified behavior -- [Warning C26441](../code-quality/c26441.md) - Clarified behavior -- [Warning C26444](../code-quality/c26444.md) - Clarified behavior -- [Warning C26449](../code-quality/c26449.md) - Clarified behavior -- [Warning C26450](../code-quality/c26450.md) - Clarified behavior -- [Warning C26451](../code-quality/c26451.md) - Clarified behavior -- [Warning C26452](../code-quality/c26452.md) - Clarified behavior -- [Warning C26453](../code-quality/c26453.md) - Clarified behavior -- [Warning C26454](../code-quality/c26454.md) - Clarified behavior -- [Warning C26494](../code-quality/c26494.md) - Clarified behavior -- [Warning C26495](../code-quality/c26495.md) - Clarified behavior -- [Warning C26810](../code-quality/c26810.md) - Clarified behavior -- [Warning C26811](../code-quality/c26811.md) - Clarified behavior -- [Warning C26815](../code-quality/c26815.md) - Clarified behavior -- [Warning C26816](../code-quality/c26816.md) - Clarified behavior -- [Warning C26819](../code-quality/c26819.md) - Clarified behavior -- [Warning C6011](../code-quality/c6011.md) - Clarified behavior -- [Warning C6200](../code-quality/c6200.md) - Clarified behavior -- [Warning C28306](../code-quality/c28306.md) - Clarified behavior -- [Warning C28307](../code-quality/c28307.md) - Clarified behavior -- [Warning C26437](../code-quality/c26437.md) - Clarified behavior -- [Warning C26439](../code-quality/c26439.md) - Clarified behavior -- [Warning C26455](../code-quality/c26455.md) - Clarified behavior -- [Warning C26498](../code-quality/c26498.md) - Clarified behavior -- [Warning C26800](../code-quality/c26800.md) - Clarified behavior -- [Warning C26813](../code-quality/c26813.md) - Clarified behavior -- [Warning C26827](../code-quality/c26827.md) - Clarified behavior -- [Warning C26828](../code-quality/c26828.md) - Clarified behavior -- [Warning C33010](../code-quality/c33010.md) - Clarified behavior - -### Cross platform development +- [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks. +- [Warning C6011](../code-quality/c6011.md) - Clarified behavior. +- [Warning C6200](../code-quality/c6200.md) - Clarified behavior. +- [Warning C26437](../code-quality/c26437.md) - Clarified behavior. +- [Warning C26439](../code-quality/c26439.md) - Clarified behavior. +- [Warning C26441](../code-quality/c26441.md) - Clarified behavior. +- [Warning C26444](../code-quality/c26444.md) - Clarified behavior. +- [Warning C26449](../code-quality/c26449.md) - Clarified behavior. +- [Warning C26450](../code-quality/c26450.md) - Clarified behavior. +- [Warning C26451](../code-quality/c26451.md) - Clarified behavior. +- [Warning C26452](../code-quality/c26452.md) - Clarified behavior. +- [Warning C26453](../code-quality/c26453.md) - Clarified behavior. +- [Warning C26454](../code-quality/c26454.md) - Clarified behavior. +- [Warning C26455](../code-quality/c26455.md) - Clarified behavior. +- [Warning C26494](../code-quality/c26494.md) - Clarified behavior. +- [Warning C26495](../code-quality/c26495.md) - Clarified behavior. +- [Warning C26498](../code-quality/c26498.md) - Clarified behavior. +- [Warning C26800](../code-quality/c26800.md) - Clarified behavior. +- [Warning C26810](../code-quality/c26810.md) - Clarified behavior. +- [Warning C26811](../code-quality/c26811.md) - Clarified behavior. +- [Warning C26813](../code-quality/c26813.md) - Clarified behavior. +- [Warning C26815](../code-quality/c26815.md) - Clarified behavior. +- [Warning C26816](../code-quality/c26816.md) - Clarified behavior. +- [Warning C26819](../code-quality/c26819.md) - Clarified behavior. +- [Warning C26827](../code-quality/c26827.md) - Clarified behavior. +- [Warning C26828](../code-quality/c26828.md) - Clarified behavior. +- [Warning C28196](../code-quality/c28196.md) - Clarified behavior. +- [Warning C28306](../code-quality/c28306.md) - Clarified behavior. +- [Warning C28307](../code-quality/c28307.md) - Clarified behavior. +- [Warning C33010](../code-quality/c33010.md) - Clarified behavior. + +## Cross platform development **Updated articles** -- [Build an OpenGL ES application on Android and iOS](../cross-platform/build-an-opengl-es-application-on-android-and-ios.md) - Updated documentation to reflect removal of OpenGL +- [Build an OpenGL ES application on Android and iOS](../cross-platform/build-an-opengl-es-application-on-android-and-ios.md) - Updated documentation to reflect removal of OpenGL. -### Overview of Windows programming in C++ +## Overview of Windows programming in C++ **Updated articles** @@ -186,7 +181,7 @@ This section lists major changes to the Microsoft C++ docs February 2023 through For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). -### C runtime library +## C runtime library **Updated articles** @@ -198,70 +193,70 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [`sprintf`, `_sprintf_l`, `swprintf`, `_swprintf`, `_swprintf_l`, `__swprintf_l`](../c-runtime-library/reference/sprintf-sprintf-l-swprintf-swprintf-l-swprintf-l.md) - Documented `_swprintf` and how `_CRT_NON_CONFORMING_SWPRINTFS` maps calls to `swprintf` to `_swprintf`. - [`strtok`, `_strtok_l`, `wcstok`, `_wcstok_l`, `_mbstok`, `_mbstok_l`](../c-runtime-library/reference/strtok-strtok-l-wcstok-wcstok-l-mbstok-mbstok-l.md) - Noted the nonstandard `wcstok()` and how to call it. - [`wcstombs`, `_wcstombs_l`](../c-runtime-library/reference/wcstombs-wcstombs-l.md) - Added note about UTF-8 support. -- [`fma`, `fmaf`, `fmal`](../c-runtime-library/reference/fma-fmaf-fmal.md) - Corrected the documentation for `fmaf` +- [`fma`, `fmaf`, `fmal`](../c-runtime-library/reference/fma-fmaf-fmal.md) - Corrected the documentation for `fmaf`. -### C/C++ compiler and tools errors and warnings +## C/C++ compiler and tools errors and warnings **New articles** -- [Compiler error C7688](../error-messages/compiler-errors-2/compiler-error-c7688.md) -- [Compiler warning (level 1, error, off) C5262](../error-messages/compiler-warnings/c5262.md) -- [Compiler warnings (level 1) C5301 and C5302](../error-messages/compiler-warnings/c5301-c5302.md) +- [Compiler error C7688](../error-messages/compiler-errors-2/compiler-error-c7688.md). +- [Compiler warning (level 1, error, off) C5262](../error-messages/compiler-warnings/c5262.md). +- [Compiler warnings (level 1) C5301 and C5302](../error-messages/compiler-warnings/c5301-c5302.md). **Updated articles** -- [Compiler Warnings by compiler version](../error-messages/compiler-warnings/compiler-warnings-by-compiler-version.md) - Updated with changes for VS 17.5 -- [Compiler warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - Updated with changes for VS 17.5 +- [Compiler Warnings by compiler version](../error-messages/compiler-warnings/compiler-warnings-by-compiler-version.md) - Updated with changes for VS 17.5. +- [Compiler warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - Updated with changes for VS 17.5. -### C/C++ compiler intrinsics and assembly language +## C/C++ compiler intrinsics and assembly language -### C/C++ in Visual Studio overview +## C/C++ in Visual Studio overview **Updated articles** -- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Updated for VS 17.5 changes -- [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Update with changes for VS 17.5 -- [What's new for C++ in Visual Studio 2022](../overview/what-s-new-for-visual-cpp-in-visual-studio.md) - Update with changes for VS 17.5 +- [C++ Conformance improvements, behavior changes, and bug fixes in Visual Studio 2022](../overview/cpp-conformance-improvements.md) - Updated for VS 17.5 changes. +- [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Update with changes for VS 17.5. +- [What's new for C++ in Visual Studio 2022](../overview/what-s-new-for-visual-cpp-in-visual-studio.md) - Update with changes for VS 17.5. -### C/C++ preprocessor reference +## C/C++ preprocessor reference **Updated articles** -- [Predefined macros](../preprocessor/predefined-macros.md) - Update _MSC_VER values for 17.3, 17.4, and 17.5 -- [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - Update with changes for VS 17.5 +- [Predefined macros](../preprocessor/predefined-macros.md) - Update _MSC_VER values for 17.3, 17.4, and 17.5. +- [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - Update with changes for VS 17.5. -### C/C++ projects and build systems +## C/C++ projects and build systems **Updated articles** -- [Use the Microsoft C++ toolset from the command line](../build/building-on-the-command-line.md) - Improved command-line instructions -- [Walkthrough: Compiling a C++/CLI Program on the Command Line](../build/walkthrough-compiling-a-cpp-cli-program-on-the-command-line.md) - Improved command-line instructions -- [Walkthrough: Compiling a C++/CX Program on the Command Line](../build/walkthrough-compiling-a-cpp-cx-program-on-the-command-line.md) - Improved dev command line instructions -- [`/Gs` (Control stack checking calls)](../build/reference/gs-control-stack-checking-calls.md) - Updated max value for /Gs -- [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Corrected HFA return values +- [Use the Microsoft C++ toolset from the command line](../build/building-on-the-command-line.md) - Improved command-line instructions. +- [Walkthrough: Compiling a C++/CLI Program on the Command Line](../build/walkthrough-compiling-a-cpp-cli-program-on-the-command-line.md) - Improved command-line instructions. +- [Walkthrough: Compiling a C++/CX Program on the Command Line](../build/walkthrough-compiling-a-cpp-cx-program-on-the-command-line.md) - Improved dev command line instructions. +- [`/Gs` (Control stack checking calls)](../build/reference/gs-control-stack-checking-calls.md) - Updated max value for /Gs. +- [Overview of ARM64 ABI conventions](../build/arm64-windows-abi-conventions.md) - Corrected HFA return values. - [ARM64 exception handling](../build/arm64-exception-handling.md) - In the compressed format, PAC is identified by CR=2, not 3. - [Reference: vcperf commands](../build-insights/reference/vcperf-commands.md) - Updated which commands require administrative privileges. -### C++ in Visual Studio +## C++ in Visual Studio **Updated articles** -- [Transporting exceptions between threads](../cpp/transporting-exceptions-between-threads.md) - fix section about types of exception handling +- [Transporting exceptions between threads](../cpp/transporting-exceptions-between-threads.md) - fix section about types of exception handling. - [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) - Updated wording and fixed problems with the path and suggested directory location. -### C++ in Visual Studio tutorials +## C++ in Visual Studio tutorials **Updated articles** - [Create a console calculator in C++](../get-started/tutorial-console-cpp.md) - updated screenshots and updated the result and exception error format. -### C++ Standard Template Library (STL) reference +## C++ Standard Template Library (STL) reference **Updated articles** -- [`directory_iterator` class](../standard-library/directory-iterator-class.md) - remove experimental +- [`directory_iterator` class](../standard-library/directory-iterator-class.md) - remove experimental. -### Code quality +## Code quality **New articles** @@ -271,41 +266,41 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua **Updated articles** -- [Warning C6001](../code-quality/c6001.md) - Added examples explaining initialization heuristics for C6001 -- [Best practices and examples (SAL)](../code-quality/best-practices-and-examples-sal.md) - fix SAL annotation -- [Warning C26441](../code-quality/c26441.md) - SA diagnostic updates part 1 -- [Warning C28213](../code-quality/c28213.md) - SA diagnostic updates part 1 +- [Warning C6001](../code-quality/c6001.md) - Added examples explaining initialization heuristics for C6001. +- [Best practices and examples (SAL)](../code-quality/best-practices-and-examples-sal.md) - fix SAL annotation. +- [Warning C26441](../code-quality/c26441.md) - Clarified example. +- [Warning C28213](../code-quality/c28213.md) - Clarified example. - [Warning C6029](../code-quality/c6029.md) - Updated description. - [Warning C6064](../code-quality/c6064.md) - Clarified example. - [Warning C6101](../code-quality/c6101.md) - Clarified text. - [Warning C6217](../code-quality/c6217.md) - Clarified text. -### Linux with C++ in Visual Studio +## Linux with C++ in Visual Studio **Updated articles** -- [Linux development with C++](../linux/index.yml) - [Bulk] Update author fields in cpp-docs-pr - [Connect to your target Linux system in Visual Studio](../linux/connect-to-your-remote-linux-computer.md) - Added note regarding `ssh-keygen`. -### Overview of Windows programming in C++ + +## Overview of Windows programming in C++ **Updated articles** -- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - explained why there aren't version numbers listed for VS 2015-2022 +- [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - explained why there aren't version numbers listed for VS 2015-2022. -### Read and write code using C++ in Visual Studio +## Read and write code using C++ in Visual Studio **Updated articles** - [Add a class from an ActiveX control](../ide/adding-a-class-from-an-activex-control-visual-cpp.md) - Clarified which project types the wizard applies to. -- [Walkthrough: Working with Projects and Solutions (C++)](../ide/walkthrough-working-with-projects-and-solutions-cpp.md) - Updated for Visual Studio 17.5 +- [Walkthrough: Working with Projects and Solutions (C++)](../ide/walkthrough-working-with-projects-and-solutions-cpp.md) - Updated for Visual Studio 17.5. -### STL/CLR library reference +## STL/CLR library reference **Updated articles** - [`queue` (STL/CLR)](../dotnet/queue-stl-clr.md) - fixed compilation error in code examples. -## Community contributors +### Community contributors The following people contributed to the C++, C, and Assembler docs during this period. Thank you! The following people contributed to the C++, C, and Assembler docs during this period. Thank you! See our [contributor guide](/contribute) if you'd like to learn how to contribute. From 8ace43fd25153af163f305a48df7f94efd96687c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 14:42:43 -0700 Subject: [PATCH 0074/1931] fix dupe headers --- docs/overview/whats-new-cpp-docs.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index 01c9d16c3b..2bb7b87c26 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -181,7 +181,7 @@ This section lists major changes to the Microsoft C++ docs February 2023 through For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). -## C runtime library +### C runtime library **Updated articles** @@ -195,7 +195,7 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [`wcstombs`, `_wcstombs_l`](../c-runtime-library/reference/wcstombs-wcstombs-l.md) - Added note about UTF-8 support. - [`fma`, `fmaf`, `fmal`](../c-runtime-library/reference/fma-fmaf-fmal.md) - Corrected the documentation for `fmaf`. -## C/C++ compiler and tools errors and warnings +### C/C++ compiler and tools errors and warnings **New articles** @@ -208,9 +208,9 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [Compiler Warnings by compiler version](../error-messages/compiler-warnings/compiler-warnings-by-compiler-version.md) - Updated with changes for VS 17.5. - [Compiler warnings C4800 through C5999](../error-messages/compiler-warnings/compiler-warnings-c4800-through-c4999.md) - Updated with changes for VS 17.5. -## C/C++ compiler intrinsics and assembly language +### C/C++ compiler intrinsics and assembly language -## C/C++ in Visual Studio overview +### C/C++ in Visual Studio overview **Updated articles** @@ -218,14 +218,14 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [Microsoft C/C++ language conformance by Visual Studio version](../overview/visual-cpp-language-conformance.md) - Update with changes for VS 17.5. - [What's new for C++ in Visual Studio 2022](../overview/what-s-new-for-visual-cpp-in-visual-studio.md) - Update with changes for VS 17.5. -## C/C++ preprocessor reference +### C/C++ preprocessor reference **Updated articles** - [Predefined macros](../preprocessor/predefined-macros.md) - Update _MSC_VER values for 17.3, 17.4, and 17.5. - [Compiler warnings that are off by default](../preprocessor/compiler-warnings-that-are-off-by-default.md) - Update with changes for VS 17.5. -## C/C++ projects and build systems +### C/C++ projects and build systems **Updated articles** @@ -237,26 +237,26 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [ARM64 exception handling](../build/arm64-exception-handling.md) - In the compressed format, PAC is identified by CR=2, not 3. - [Reference: vcperf commands](../build-insights/reference/vcperf-commands.md) - Updated which commands require administrative privileges. -## C++ in Visual Studio +### C++ in Visual Studio **Updated articles** - [Transporting exceptions between threads](../cpp/transporting-exceptions-between-threads.md) - fix section about types of exception handling. - [Tutorial: Import the C++ standard library using modules from the command line](../cpp/tutorial-import-stl-named-module.md) - Updated wording and fixed problems with the path and suggested directory location. -## C++ in Visual Studio tutorials +### C++ in Visual Studio tutorials **Updated articles** - [Create a console calculator in C++](../get-started/tutorial-console-cpp.md) - updated screenshots and updated the result and exception error format. -## C++ Standard Template Library (STL) reference +### C++ Standard Template Library (STL) reference **Updated articles** - [`directory_iterator` class](../standard-library/directory-iterator-class.md) - remove experimental. -## Code quality +### Code quality **New articles** @@ -275,26 +275,26 @@ For what's new related to C++ in Visual Studio, see [What's new for C++ in Visua - [Warning C6101](../code-quality/c6101.md) - Clarified text. - [Warning C6217](../code-quality/c6217.md) - Clarified text. -## Linux with C++ in Visual Studio +### Linux with C++ in Visual Studio **Updated articles** - [Connect to your target Linux system in Visual Studio](../linux/connect-to-your-remote-linux-computer.md) - Added note regarding `ssh-keygen`. -## Overview of Windows programming in C++ +### Overview of Windows programming in C++ **Updated articles** - [Microsoft Visual C++ Redistributable latest supported downloads](../windows/latest-supported-vc-redist.md) - explained why there aren't version numbers listed for VS 2015-2022. -## Read and write code using C++ in Visual Studio +### Read and write code using C++ in Visual Studio **Updated articles** - [Add a class from an ActiveX control](../ide/adding-a-class-from-an-activex-control-visual-cpp.md) - Clarified which project types the wizard applies to. - [Walkthrough: Working with Projects and Solutions (C++)](../ide/walkthrough-working-with-projects-and-solutions-cpp.md) - Updated for Visual Studio 17.5. -## STL/CLR library reference +### STL/CLR library reference **Updated articles** From c6e3d0ea753c09d7f3345684564ed25f8c256886 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 14:55:50 -0700 Subject: [PATCH 0075/1931] condense some entries --- docs/overview/whats-new-cpp-docs.md | 55 +++++++++++------------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index 2bb7b87c26..33285df98a 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -32,17 +32,17 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu - [`register` storage-class specifier](../c-language/register-storage-class-specifier.md) - Added C5033 warning. - [C Pragmas](../c-language/c-pragmas.md) - Added `system_header` pragma documentation. -- [C Bit Fields](../c-language/c-bit-fields.md) - Clarified `int main(void)` example & documented that MSVC doesn't straddle bit-fields. +- [C Bit Fields](../c-language/c-bit-fields.md) - Clarified example & documented that MSVC doesn't straddle bit-fields. ## C runtime library **Updated articles** - [`_iob`](../c-runtime-library/iob.md) - Clarified value of `_IOB_ENTRIES` across VS versions. -- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior in a table for readability. -- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior in a table for readability. -- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior in a table for readability. -- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior in a table for readability. +- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior for various argument value combinations. +- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior for various argument value combinations. +- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior for various argument value combinations. +- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior for various argument value combinations. - [`to` functions](../c-runtime-library/to-functions.md) - Fixed code example. - [`strerror_s`, `_strerror_s`, `_wcserror_s`, `__wcserror_s`](../c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s.md) - Clarified behavior. - [`strerror`, `_strerror`, `_wcserror`, `__wcserror`](../c-runtime-library/reference/strerror-strerror-wcserror-wcserror.md) - Clarified behavior. @@ -118,35 +118,22 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** - [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks. -- [Warning C6011](../code-quality/c6011.md) - Clarified behavior. -- [Warning C6200](../code-quality/c6200.md) - Clarified behavior. -- [Warning C26437](../code-quality/c26437.md) - Clarified behavior. -- [Warning C26439](../code-quality/c26439.md) - Clarified behavior. -- [Warning C26441](../code-quality/c26441.md) - Clarified behavior. -- [Warning C26444](../code-quality/c26444.md) - Clarified behavior. -- [Warning C26449](../code-quality/c26449.md) - Clarified behavior. -- [Warning C26450](../code-quality/c26450.md) - Clarified behavior. -- [Warning C26451](../code-quality/c26451.md) - Clarified behavior. -- [Warning C26452](../code-quality/c26452.md) - Clarified behavior. -- [Warning C26453](../code-quality/c26453.md) - Clarified behavior. -- [Warning C26454](../code-quality/c26454.md) - Clarified behavior. -- [Warning C26455](../code-quality/c26455.md) - Clarified behavior. -- [Warning C26494](../code-quality/c26494.md) - Clarified behavior. -- [Warning C26495](../code-quality/c26495.md) - Clarified behavior. -- [Warning C26498](../code-quality/c26498.md) - Clarified behavior. -- [Warning C26800](../code-quality/c26800.md) - Clarified behavior. -- [Warning C26810](../code-quality/c26810.md) - Clarified behavior. -- [Warning C26811](../code-quality/c26811.md) - Clarified behavior. -- [Warning C26813](../code-quality/c26813.md) - Clarified behavior. -- [Warning C26815](../code-quality/c26815.md) - Clarified behavior. -- [Warning C26816](../code-quality/c26816.md) - Clarified behavior. -- [Warning C26819](../code-quality/c26819.md) - Clarified behavior. -- [Warning C26827](../code-quality/c26827.md) - Clarified behavior. -- [Warning C26828](../code-quality/c26828.md) - Clarified behavior. -- [Warning C28196](../code-quality/c28196.md) - Clarified behavior. -- [Warning C28306](../code-quality/c28306.md) - Clarified behavior. -- [Warning C28307](../code-quality/c28307.md) - Clarified behavior. -- [Warning C33010](../code-quality/c33010.md) - Clarified behavior. +- Clarified behavior for the following warnings: +- [Warning C6011](../code-quality/c6011.md), [Warning C6200](../code-quality/c6200.md) - Clarified behavior. +- [Warning C26437](../code-quality/c26437.md), [Warning C26439](../code-quality/c26439.md) - Clarified behavior. +- [Warning C26441](../code-quality/c26441.md), [Warning C26444](../code-quality/c26444.md) - Clarified behavior. +- [Warning C26449](../code-quality/c26449.md), [Warning C26450](../code-quality/c26450.md) +- [Warning C26451](../code-quality/c26451.md), [Warning C26452](../code-quality/c26452.md) +- [Warning C26453](../code-quality/c26453.md), [Warning C26454](../code-quality/c26454.md) +- [Warning C26455](../code-quality/c26455.md), [Warning C26494](../code-quality/c26494.md) +- [Warning C26495](../code-quality/c26495.md), [Warning C26498](../code-quality/c26498.md) +- [Warning C26800](../code-quality/c26800.md), [Warning C26810](../code-quality/c26810.md) +- [Warning C26811](../code-quality/c26811.md), [Warning C26813](../code-quality/c26813.md) +- [Warning C26815](../code-quality/c26815.md), [Warning C26816](../code-quality/c26816.md) +- [Warning C26819](../code-quality/c26819.md), [Warning C26827](../code-quality/c26827.md) +- [Warning C26828](../code-quality/c26828.md), [Warning C28196](../code-quality/c28196.md) +- [Warning C28306](../code-quality/c28306.md), [Warning C28307](../code-quality/c28307.md) +- [Warning C33010](../code-quality/c33010.md) ## Cross platform development From 1a785a491060b785f1e085dfb88dfb9715580f45 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 15:13:35 -0700 Subject: [PATCH 0076/1931] small edits --- docs/overview/whats-new-cpp-docs.md | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index 33285df98a..f5873b13d9 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -6,9 +6,9 @@ ms.custom: intro-whats-new monikerRange: '>=msvc-160' --- -# Microsoft C++ docs: What's new for August 2023 +# Microsoft C++ docs: What's new for May 2023 to August 2023 -This article lists major changes to the Microsoft C++ docs May 2023 through August 2023. These changes correspond to Visual Studio version 17.7. +This article lists major changes to the Microsoft C++ docs May 2023 through August 2023. These changes correspond approximately to Visual Studio version 17.7. - For what was new in the docs in previous months, see [What's new history](#whats-new-history). - For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). @@ -39,10 +39,10 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** - [`_iob`](../c-runtime-library/iob.md) - Clarified value of `_IOB_ENTRIES` across VS versions. -- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior for various argument value combinations. -- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior for various argument value combinations. -- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior for various argument value combinations. -- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior for various argument value combinations. +- [`_snprintf_s`, `_snprintf_s_l`, `_snwprintf_s`, `_snwprintf_s_l`](../c-runtime-library/reference/snprintf-s-snprintf-s-l-snwprintf-s-snwprintf-s-l.md) - Summarized behavior for argument value combinations. +- [`snprintf`, `_snprintf`, `_snprintf_l`, `_snwprintf`, `_snwprintf_l`](../c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l.md) - Summarized behavior for argument value combinations. +- [`vsnprintf_s`, `_vsnprintf_s`, `_vsnprintf_s_l`, `_vsnwprintf_s`, `_vsnwprintf_s_l`](../c-runtime-library/reference/vsnprintf-s-vsnprintf-s-vsnprintf-s-l-vsnwprintf-s-vsnwprintf-s-l.md) - Summarized behavior for argument value combinations. +- [`vsnprintf`, `_vsnprintf`, `_vsnprintf_l`, `_vsnwprintf`, `_vsnwprintf_l`](../c-runtime-library/reference/vsnprintf-vsnprintf-vsnprintf-l-vsnwprintf-vsnwprintf-l.md) - Summarized behavior for argument value combinations. - [`to` functions](../c-runtime-library/to-functions.md) - Fixed code example. - [`strerror_s`, `_strerror_s`, `_wcserror_s`, `__wcserror_s`](../c-runtime-library/reference/strerror-s-strerror-s-wcserror-s-wcserror-s.md) - Clarified behavior. - [`strerror`, `_strerror`, `_wcserror`, `__wcserror`](../c-runtime-library/reference/strerror-strerror-wcserror-wcserror.md) - Clarified behavior. @@ -119,9 +119,9 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu - [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks. - Clarified behavior for the following warnings: -- [Warning C6011](../code-quality/c6011.md), [Warning C6200](../code-quality/c6200.md) - Clarified behavior. -- [Warning C26437](../code-quality/c26437.md), [Warning C26439](../code-quality/c26439.md) - Clarified behavior. -- [Warning C26441](../code-quality/c26441.md), [Warning C26444](../code-quality/c26444.md) - Clarified behavior. +- [Warning C6011](../code-quality/c6011.md), [Warning C6200](../code-quality/c6200.md) +- [Warning C26437](../code-quality/c26437.md), [Warning C26439](../code-quality/c26439.md) +- [Warning C26441](../code-quality/c26441.md), [Warning C26444](../code-quality/c26444.md) - [Warning C26449](../code-quality/c26449.md), [Warning C26450](../code-quality/c26450.md) - [Warning C26451](../code-quality/c26451.md), [Warning C26452](../code-quality/c26452.md) - [Warning C26453](../code-quality/c26453.md), [Warning C26454](../code-quality/c26454.md) @@ -164,7 +164,7 @@ The following people contributed to the C++, C, and Assembler docs during this p ## What's new history -This section lists major changes to the Microsoft C++ docs February 2023 through May 2023. These changes correspond to Visual Studio version 17.6. +This section lists major changes to the Microsoft C++ docs February 2023 through May 2023. These changes correspond approximately to Visual Studio version 17.6. For what's new related to C++ in Visual Studio, see [What's new for C++ in Visual Studio](what-s-new-for-visual-cpp-in-visual-studio.md). From 8bf266d4a543fd71bc1fae4a578ddfbe7199599d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 15:21:16 -0700 Subject: [PATCH 0077/1931] set off section --- docs/overview/whats-new-cpp-docs.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/overview/whats-new-cpp-docs.md b/docs/overview/whats-new-cpp-docs.md index f5873b13d9..c364632b1c 100644 --- a/docs/overview/whats-new-cpp-docs.md +++ b/docs/overview/whats-new-cpp-docs.md @@ -118,7 +118,8 @@ This article lists major changes to the Microsoft C++ docs May 2023 through Augu **Updated articles** - [Use the C++ Core Guidelines checkers](../code-quality/using-the-cpp-core-guidelines-checkers.md) - No longer suggest turning off annotation processing for CppCoreChecks. -- Clarified behavior for the following warnings: + +Clarified behavior for the following warnings: - [Warning C6011](../code-quality/c6011.md), [Warning C6200](../code-quality/c6200.md) - [Warning C26437](../code-quality/c26437.md), [Warning C26439](../code-quality/c26439.md) - [Warning C26441](../code-quality/c26441.md), [Warning C26444](../code-quality/c26444.md) From 854b38dd6eddabf18e51443846d1c29232e45cef Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 17:16:36 -0700 Subject: [PATCH 0078/1931] update what's new in c++ --- ...t-s-new-for-visual-cpp-in-visual-studio.md | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md index 4e9120e2ac..529c67a0ba 100644 --- a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md +++ b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md @@ -1,19 +1,33 @@ --- title: "What's new for C++ in Visual Studio" description: "The new features and fixes in the Microsoft C/C++ compiler and tools in Visual Studio." -ms.date: 02/28/2023 +ms.date: 08/23/2023 ms.technology: "cpp-ide" ms.custom: intro-whats-new --- + # What's new for C++ in Visual Studio 2022 Visual Studio 2022 brings many updates and fixes to the Microsoft C++ environment. We've added features and fixed many bugs and issues in the compiler and tools. The Visual Studio IDE also offers significant improvements in performance and productivity, and now runs natively as a 64-bit application. For more information on what's new in all of Visual Studio, see [What's new in Visual Studio 2022](/visualstudio/ide/whats-new-visual-studio-2022?view=vs-2022&preserve-view=true). For information about what's new in the C++ docs, see [Microsoft C++ docs: What's new](./whats-new-cpp-docs.md) +## What's new for C++ in Visual Studio version 17.7 + +For a summary of new C++ features in Visual Studio in version 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). + +For a summary of new C++ features that are specific to game development, see [Unleashing the Power of Visual Studio 2022 for C++ Game Development](https://devblogs.microsoft.com/visualstudio/unleashing-the-power-of-visual-studio-2022-for-c-game-development/#:~:text=Unleashing%20the%20Power%20of%20Visual%20Studio%202022%20for,6%20Optimizing%20Build%20Times%20in%20Visual%20Studio%20) + +[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). + +## What's new for C++ in Visual Studio version 17.6 + +For a summary of new C++ features in Visual Studio in version 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). + ## What's new for C++ in Visual Studio version 17.5 -For a summary of new features and bug fixes in Visual Studio in version 17.5, see [Visual Studio 2022 version 17.5 Release Notes](/visualstudio/releases/2022/release-notes-v17.5). +For a summary of new C++ features in Visual Studio in version 17.5, see [What’s New for C++ Developers in Visual Studio 2022 17.5](https://devblogs.microsoft.com/cppblog/visual-studio-17-5-for-cpp-devs/). +For an overall summary of new features and bug fixes in Visual Studio in version 17.5, see [Visual Studio 2022 version 17.5 Release Notes](/visualstudio/releases/2022/release-notes-v17.5). - `std::move`, `std::forward`, `std::move_if_noexcept`, and `std::forward_like` now don't produce function calls in generated code, even in debug mode. This change avoids named casts causing unnecessary overhead in debug builds. `/permissive-` (or an option that implies it, such as `/std:c++20` or `std:c++latest`) is required. @@ -67,7 +81,7 @@ For a summary of new features and bug fixes in Visual Studio in version 17.5, se ## What's new for C++ in Visual Studio version 17.4 -For a summary of new features and bug fixes in Visual Studio in version 17.4, see [Visual Studio 2022 version 17.4 Release Notes](/visualstudio/releases/2022/release-notes-v17.4). +For a summary of new features and bug fixes in Visual Studio in version 17.4, see [Visual Studio 2022 version 17.4 Release Notes](/visualstudio/releases/2022/release-notes-v17.4) and [What’s New for C++ Developers in Visual Studio 2022 17.4](https://devblogs.microsoft.com/cppblog/whats-new-for-cpp-developers-in-visual-studio-2022-17-4/). - Improved compiler error messages to provide more correct and useful information, especially for concepts. @@ -123,7 +137,7 @@ For a summary of new features and bug fixes in Visual Studio in version 17.4, se ## What's new for C++ in Visual Studio version 17.3 -For a summary of new features and bug fixes in Visual Studio in version 17.3, see [Visual Studio 2022 version 17.3 Release Notes](/visualstudio/releases/2022/release-notes-v17.3). +For a summary of new features and bug fixes in Visual Studio in version 17.3, see [Visual Studio 2022 version 17.3 Release Notes](/visualstudio/releases/2022/release-notes-v17.3) and [C++ improvements](https://devblogs.microsoft.com/visualstudio/visual-studio-2022-17-3-is-now-available/#c-improvements). - The Arm64EC toolchain is no longer marked as experimental and is ready for production use. @@ -187,9 +201,8 @@ For a summary of new features and bug fixes in Visual Studio in version 17.1, se - Visual Studio's CMake integration is only active when a *`CMakeLists.txt`* is identified at the root of the open workspace. If a *`CMakeLists.txt`* is identified at another level of the workspace, then you're prompted to activate Visual Studio's CMake integration with a notification. -- Added a new register visualization window for embedded targets, available through **Debug** > **Windows** > **Embedded Registers**. - -- Added a new thread view for RTOS projects, available through **Debug** > **Windows** > **RTOS Objects**. +- New views that enable you to inspect and interact with peripheral registers on microcontrollers and real time operating systems (RTOS) objects, available through **Debug** > **Windows** > **Embedded Registers** +- Added a new thread view for RTOS projects, available through **Debug** > **Windows** > **RTOS Objects**. For more information, see [Embedded Software Development in Visual Studio](https://devblogs.microsoft.com/cppblog/visual-studio-embedded-development/) ## What's new for C++ in Visual Studio version 17.0 From f4b4c7fda9f069c599525385b1850f497afbcd11 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 22 Aug 2023 17:33:07 -0700 Subject: [PATCH 0079/1931] add whats new info --- .../what-s-new-for-visual-cpp-in-visual-studio.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md index 529c67a0ba..529ea4098c 100644 --- a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md +++ b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md @@ -14,15 +14,17 @@ For more information on what's new in all of Visual Studio, see [What's new in V ## What's new for C++ in Visual Studio version 17.7 -For a summary of new C++ features in Visual Studio in version 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). +For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). For a summary of new C++ features that are specific to game development, see [Unleashing the Power of Visual Studio 2022 for C++ Game Development](https://devblogs.microsoft.com/visualstudio/unleashing-the-power-of-visual-studio-2022-for-c-game-development/#:~:text=Unleashing%20the%20Power%20of%20Visual%20Studio%202022%20for,6%20Optimizing%20Build%20Times%20in%20Visual%20Studio%20) -[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). +For a summary of new features in Visual Studio 17.7, see[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). ## What's new for C++ in Visual Studio version 17.6 -For a summary of new C++ features in Visual Studio in version 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). +For a summary of new C++ features in Visual Studio 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). + +For a summary of new features in Visual Studio 17.6, see [Visual Studio 2022 version 17.6 Release Notes](/visualstudio/releases/2022/release-notes-v17.6). ## What's new for C++ in Visual Studio version 17.5 From af4044c5a65247632ead5572e3e577a2bb7f6320 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 25 Aug 2023 13:44:05 -0700 Subject: [PATCH 0080/1931] draft --- .../what-s-new-for-visual-cpp-in-visual-studio.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md index 529ea4098c..e7a47caa0d 100644 --- a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md +++ b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md @@ -14,17 +14,17 @@ For more information on what's new in all of Visual Studio, see [What's new in V ## What's new for C++ in Visual Studio version 17.7 -For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). +For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). Briefly, some of the new features are: faster debugging sessions and faster project load times, step-by-step visualization of macro exspansions, one-click download for Windows Subsystem for Linux (WSL), improved support for Doxygen comments, C++ Build Insights for game development, and Unreal Engine project improvements such as much faster IntelliSense and syntax colorization, the ability to find all Unreal Engine Blueprint references, and more. For a summary of new C++ features that are specific to game development, see [Unleashing the Power of Visual Studio 2022 for C++ Game Development](https://devblogs.microsoft.com/visualstudio/unleashing-the-power-of-visual-studio-2022-for-c-game-development/#:~:text=Unleashing%20the%20Power%20of%20Visual%20Studio%202022%20for,6%20Optimizing%20Build%20Times%20in%20Visual%20Studio%20) -For a summary of new features in Visual Studio 17.7, see[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). +For a summary of new features in the Visual Studio 17.7 IDE, see[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). ## What's new for C++ in Visual Studio version 17.6 -For a summary of new C++ features in Visual Studio 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). +For a summary of new C++ features in Visual Studio 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). Briefly, some of the new features are: a CMAKE debugger to debug CMake scripts, built-in support for High Level Shading Language (HLSL) and an Unreal Engine Log viewer, initial support for C++20 in C++/CLI projects, vcpkg is now added by default, and a few C++23 standard library features have been added for ranges, amongst others. -For a summary of new features in Visual Studio 17.6, see [Visual Studio 2022 version 17.6 Release Notes](/visualstudio/releases/2022/release-notes-v17.6). +For a summary of new features in Visual Studio 17.6 IDE, see [Visual Studio 2022 version 17.6 Release Notes](/visualstudio/releases/2022/release-notes-v17.6). ## What's new for C++ in Visual Studio version 17.5 From 89635b4ae5a1eb6baf58e57b9cd3482fec529802 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 25 Aug 2023 15:11:13 -0700 Subject: [PATCH 0081/1931] acrolinx --- ...what-s-new-for-visual-cpp-in-visual-studio.md | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md index e7a47caa0d..24d93d160c 100644 --- a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md +++ b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md @@ -14,7 +14,9 @@ For more information on what's new in all of Visual Studio, see [What's new in V ## What's new for C++ in Visual Studio version 17.7 -For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). Briefly, some of the new features are: faster debugging sessions and faster project load times, step-by-step visualization of macro exspansions, one-click download for Windows Subsystem for Linux (WSL), improved support for Doxygen comments, C++ Build Insights for game development, and Unreal Engine project improvements such as much faster IntelliSense and syntax colorization, the ability to find all Unreal Engine Blueprint references, and more. +For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). + +Briefly, some of the new features are: faster debugging sessions and faster project load times, step-by-step visualization of macro expansion, one-click download for Windows Subsystem for Linux (WSL), improved support for Doxygen comments, C++ Build Insights for game development, and Unreal Engine project improvements such as faster IntelliSense and syntax colorization, the ability to find all Unreal Engine Blueprint references, and more. For a summary of new C++ features that are specific to game development, see [Unleashing the Power of Visual Studio 2022 for C++ Game Development](https://devblogs.microsoft.com/visualstudio/unleashing-the-power-of-visual-studio-2022-for-c-game-development/#:~:text=Unleashing%20the%20Power%20of%20Visual%20Studio%202022%20for,6%20Optimizing%20Build%20Times%20in%20Visual%20Studio%20) @@ -22,18 +24,20 @@ For a summary of new features in the Visual Studio 17.7 IDE, see[Visual Studio 2 ## What's new for C++ in Visual Studio version 17.6 -For a summary of new C++ features in Visual Studio 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). Briefly, some of the new features are: a CMAKE debugger to debug CMake scripts, built-in support for High Level Shading Language (HLSL) and an Unreal Engine Log viewer, initial support for C++20 in C++/CLI projects, vcpkg is now added by default, and a few C++23 standard library features have been added for ranges, amongst others. +For a summary of new C++ features in Visual Studio 17.6, see [What’s New for C++ Developers in Visual Studio 2022 17.6](https://devblogs.microsoft.com/cppblog/visual-studio-17-6-for-cpp-devs/). + +Briefly, some of the new features are: CMake script debugging, built-in support for High Level Shading Language (HLSL), an Unreal Engine Log viewer, initial support for C++20 in C++/CLI projects, vcpkg is now added by default, and some C++23 standard library features for ranges. To see a full list of new features added to the standard library, see the [STL changelog](https://github.com/microsoft/STL/wiki/Changelog#vs-2022-176). For a summary of new features in Visual Studio 17.6 IDE, see [Visual Studio 2022 version 17.6 Release Notes](/visualstudio/releases/2022/release-notes-v17.6). ## What's new for C++ in Visual Studio version 17.5 For a summary of new C++ features in Visual Studio in version 17.5, see [What’s New for C++ Developers in Visual Studio 2022 17.5](https://devblogs.microsoft.com/cppblog/visual-studio-17-5-for-cpp-devs/). -For an overall summary of new features and bug fixes in Visual Studio in version 17.5, see [Visual Studio 2022 version 17.5 Release Notes](/visualstudio/releases/2022/release-notes-v17.5). +For a summary of new features and bug fixes in the Visual Studio IDE version 17.5, see [Visual Studio 2022 version 17.5 Release Notes](/visualstudio/releases/2022/release-notes-v17.5). - `std::move`, `std::forward`, `std::move_if_noexcept`, and `std::forward_like` now don't produce function calls in generated code, even in debug mode. This change avoids named casts causing unnecessary overhead in debug builds. `/permissive-` (or an option that implies it, such as `/std:c++20` or `std:c++latest`) is required. -- Added [`[[msvc::intrinsic]]`](../cpp/attributes.md#msvcintrinsic) to support the above item. You can apply this attribute to non-recursive functions consisting of a single cast, which take only one parameter. +- Added [`[[msvc::intrinsic]]`](../cpp/attributes.md#msvcintrinsic) to support the above item. You can apply this attribute to nonrecursive functions consisting of a single cast, which take only one parameter. - Added support for Linux Console in the Integrated Terminal, which allows for terminal I/O. @@ -104,7 +108,7 @@ For a summary of new features and bug fixes in Visual Studio in version 17.4, se - You can now use Dev Containers for your C++ projects. Learn more about this feature in our [Dev Containers for C++](https://aka.ms/vscppdevcontainer) blog post. -- IntelliSense now respects the order of pre-included headers when one is a PCH. Previously, when a PCH was used via **`/Yu`** and force-included via **`/FI`**, IntelliSense would always process it first, before any other headers included via **`/FI`**. This behavior didn't match the build behavior. With this change, **`/FI`** headers are processed in the order they're specified. +- IntelliSense now respects the order of preincluded headers when one of them is a PCH. Previously, when a PCH was used via **`/Yu`** and force-included via **`/FI`**, IntelliSense would always process it first, before any other headers included via **`/FI`**. This behavior didn't match the build behavior. With this change, **`/FI`** headers are processed in the order they're specified. - Removed internal prefixes from CTest names in Test Explorer. @@ -204,7 +208,7 @@ For a summary of new features and bug fixes in Visual Studio in version 17.1, se - Visual Studio's CMake integration is only active when a *`CMakeLists.txt`* is identified at the root of the open workspace. If a *`CMakeLists.txt`* is identified at another level of the workspace, then you're prompted to activate Visual Studio's CMake integration with a notification. - New views that enable you to inspect and interact with peripheral registers on microcontrollers and real time operating systems (RTOS) objects, available through **Debug** > **Windows** > **Embedded Registers** -- Added a new thread view for RTOS projects, available through **Debug** > **Windows** > **RTOS Objects**. For more information, see [Embedded Software Development in Visual Studio](https://devblogs.microsoft.com/cppblog/visual-studio-embedded-development/) +- Added a new thread view for RTOS projects, available through **Debug** > **Windows** > **RTOS Objects**. For more information, see [Embedded Software Development in Visual Studio](https://devblogs.microsoft.com/cppblog/visual-studio-embedded-development/). ## What's new for C++ in Visual Studio version 17.0 From e58d0ecbe61af06081156fd939c6e8a74b56e944 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 25 Aug 2023 16:33:55 -0700 Subject: [PATCH 0082/1931] fix vector example and output --- docs/standard-library/vector-class.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/docs/standard-library/vector-class.md b/docs/standard-library/vector-class.md index 94f797a361..85cb05379b 100644 --- a/docs/standard-library/vector-class.md +++ b/docs/standard-library/vector-class.md @@ -1,7 +1,7 @@ --- title: "vector class" description: "Reference for Microsoft C++ Standard library implementation of class vector." -ms.date: "02/23/2021" +ms.date: "08/25/2023" f1_keywords: ["vector/std::vector::allocator_type", "vector/std::vector::const_iterator", "vector/std::vector::const_pointer", "vector/std::vector::const_reference", "vector/std::vector::const_reverse_iterator", "vector/std::vector::difference_type", "vector/std::vector::iterator", "vector/std::vector::pointer", "vector/std::vector::reference", "vector/std::vector::reverse_iterator", "vector/std::vector::size_type", "vector/std::vector::value_type", "vector/std::vector::assign", "vector/std::vector::at", "vector/std::vector::back", "vector/std::vector::begin", "vector/std::vector::capacity", "vector/std::vector::cbegin", "vector/std::vector::cend", "vector/std::vector::crbegin", "vector/std::vector::crend", "vector/std::vector::clear", "vector/std::vector::data", "vector/std::vector::emplace", "vector/std::vector::emplace_back", "vector/std::vector::empty", "vector/std::vector::end", "vector/std::vector::erase", "vector/std::vector::front", "vector/std::vector::get_allocator", "vector/std::vector::insert", "vector/std::vector::max_size", "vector/std::vector::pop_back", "vector/std::vector::push_back", "vector/std::vector::rbegin", "vector/std::vector::rend", "vector/std::vector::reserve", "vector/std::vector::resize", "vector/std::vector::shrink_to_fit", "vector/std::vector::size", "vector/std::vector::swap"] helpviewer_keywords: ["std::vector [C++], allocator_type", "std::vector [C++], const_iterator", "std::vector [C++], const_pointer", "std::vector [C++], const_reference", "std::vector [C++], const_reverse_iterator", "std::vector [C++], difference_type", "std::vector [C++], iterator", "std::vector [C++], pointer", "std::vector [C++], reference", "std::vector [C++], reverse_iterator", "std::vector [C++], size_type", "std::vector [C++], value_type", "std::vector [C++], assign", "std::vector [C++], at", "std::vector [C++], back", "std::vector [C++], begin", "std::vector [C++], capacity", "std::vector [C++], cbegin", "std::vector [C++], cend", "std::vector [C++], crbegin", "std::vector [C++], crend", "std::vector [C++], clear", "std::vector [C++], data", "std::vector [C++], emplace", "std::vector [C++], emplace_back", "std::vector [C++], empty", "std::vector [C++], end", "std::vector [C++], erase", "std::vector [C++], front", "std::vector [C++], get_allocator", "std::vector [C++], insert", "std::vector [C++], max_size", "std::vector [C++], pop_back", "std::vector [C++], push_back", "std::vector [C++], rbegin", "std::vector [C++], rend", "std::vector [C++], reserve", "std::vector [C++], resize", "std::vector [C++], shrink_to_fit", "std::vector [C++], size", "std::vector [C++], swap"] --- @@ -114,7 +114,7 @@ typedef Allocator allocator_type; ### Example -See the example for [get_allocator](#get_allocator) for an example that uses `allocator_type`. +See the example for [`get_allocator`](#get_allocator) for an example that uses `allocator_type`. ## `assign` @@ -2133,6 +2133,7 @@ int main() } cout << endl; + cout << "v8 ="; vector v8{ { 1, 2, 3, 4 } }; for (auto& v : v8){ cout << " " << v ; @@ -2142,7 +2143,14 @@ int main() ``` ```Output -v1 = 0 0 0v2 = 2 2 2 2 2v3 = 1 1 1v4 = 2 2 2 2 2v5 = 0 1 2 3 4v6 = 1 2v7 = 2 2 2 2 21 2 3 4 +v1 = 0 0 0 +v2 = 2 2 2 2 2 +v3 = 1 1 1 +v4 = 2 2 2 2 2 +v5 = 0 0 0 0 0 +v6 = 0 0 +v7 = 2 2 2 2 2 +v8 = 1 2 3 4 ``` ## See also From ff54b4713127c0ea6d262ef9bfc99893eb29b626 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 25 Aug 2023 17:21:09 -0700 Subject: [PATCH 0083/1931] add /KERNEL topic --- .../reference/link-code-for-kernel-mode.md | 34 +++++++++++++++++++ docs/build/reference/linker-options.md | 7 ++-- docs/build/toc.yml | 2 ++ 3 files changed, 38 insertions(+), 5 deletions(-) create mode 100644 docs/build/reference/link-code-for-kernel-mode.md diff --git a/docs/build/reference/link-code-for-kernel-mode.md b/docs/build/reference/link-code-for-kernel-mode.md new file mode 100644 index 0000000000..367aeea024 --- /dev/null +++ b/docs/build/reference/link-code-for-kernel-mode.md @@ -0,0 +1,34 @@ +--- +description: "Learn more about: /KERNEL (Create kernel mode binary)." +title: "/KERNEL +ms.date: "08/25/2023" +--- +# /KERNEL (Create kernel mode binary) + +Create a binary that is suitable for running in kernel mode. + +## Syntax + +> **`/KERNEL`** + +## Remarks + +Causes the linker to emit a warning if any object file or library linked in the binary wasn't compiled with [/kernel](kernel-create-kernel-mode-binary.md). + +Code that can run in kernel mode must be compiled with the **`/kernel`** option. If you link a binary that contains code that wasn't compiled with **`/kernel`**, the binary might not run correctly in kernel mode. + +Code for kernel mode is compiled with a simplified set of C++ language features that are specific to code that runs in kernel mode. The compiler produces warnings for C++ language features that are potentially disruptive but can't be disabled. For more information about compiling code in kernel mode, see [/kernel (Create kernel mode binary)](kernel-create-kernel-mode-binary.md). + +### To set this linker option in Visual Studio + +1. Open the project **Property Pages** dialog box. For more information, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). + +1. Select the **Configuration Properties** > **Linker** > **Command Line** property page. + +1. In **Additional Options**, enter `/KERNELMODE`. + +## See also + +- [MSVC linker reference](linking.md) +- [MSVC linker options](linker-options.md) +- [Compiler options: /kernel](kernel-create-kernel-mode-binary.md) \ No newline at end of file diff --git a/docs/build/reference/linker-options.md b/docs/build/reference/linker-options.md index d8bb96a69c..34590f903f 100644 --- a/docs/build/reference/linker-options.md +++ b/docs/build/reference/linker-options.md @@ -1,10 +1,9 @@ --- title: "MSVC Linker options" description: "A list of the options supported by the Microsoft LINK linker." -ms.date: 09/27/2022 +ms.date: 08/25/2023 f1_keywords: ["link"] helpviewer_keywords: ["linker [C++]", "linker [C++], options listed", "libraries [C++], linking to COFF", "LINK tool [C++], linker options"] -ms.assetid: c1d51b8a-bd23-416d-81e4-900e02b2c129 --- # Linker options @@ -13,11 +12,8 @@ LINK.exe links Common Object File Format (COFF) object files and libraries to cr The following table lists options for LINK.exe. For more information about LINK, see: - [Compiler-controlled LINK options](compiler-controlled-link-options.md) - - [LINK input files](link-input-files.md) - - [LINK output](link-output.md) - - [Reserved words](reserved-words.md) On the command line, linker options aren't case-sensitive; for example, `/base` and `/BASE` mean the same thing. For details on how to specify each option on the command line or in Visual Studio, see the documentation for that option. @@ -75,6 +71,7 @@ You can use the [`comment`](../../preprocessor/comment-c-cpp.md) pragma to speci | [`/INCREMENTAL`](incremental-link-incrementally.md) | Controls incremental linking. | | [`/INFERASANLIBS`](inferasanlibs.md) | Uses inferred sanitizer libraries. | | [`/INTEGRITYCHECK`](integritycheck-require-signature-check.md) | Specifies that the module requires a signature check at load time. | +| [`/KERNEL`](kernel-mode-code-check.md) | Create a kernel mode binary. | | [`/KEYCONTAINER`](keycontainer-specify-a-key-container-to-sign-an-assembly.md) | Specifies a key container to sign an assembly. | | [`/KEYFILE`](keyfile-specify-key-or-key-pair-to-sign-an-assembly.md) | Specifies a key or key pair to sign an assembly. | | [`/LARGEADDRESSAWARE`](largeaddressaware-handle-large-addresses.md) | Tells the compiler that the application supports addresses larger than 2 gigabytes | diff --git a/docs/build/toc.yml b/docs/build/toc.yml index aa0d46009d..4224b0bfde 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -997,6 +997,8 @@ items: href: ../build/reference/inferasanlibs.md - name: /INTEGRITYCHECK (Require signature check) href: ../build/reference/integritycheck-require-signature-check.md + - name: /KERNEL (Create a kernel mode binary) + href: ../build/reference/link-code-for-kernel-mode.md - name: /KEYCONTAINER (Specify a key container to sign an assembly) href: ../build/reference/keycontainer-specify-a-key-container-to-sign-an-assembly.md - name: /KEYFILE (Specify key or key pair to sign an assembly) From 342faddadbadf04bb9a8388c011b921b5075f7de Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 25 Aug 2023 17:25:15 -0700 Subject: [PATCH 0084/1931] fix links --- docs/build/reference/link-code-for-kernel-mode.md | 2 +- docs/build/reference/linker-options.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/build/reference/link-code-for-kernel-mode.md b/docs/build/reference/link-code-for-kernel-mode.md index 367aeea024..6a9d5e3901 100644 --- a/docs/build/reference/link-code-for-kernel-mode.md +++ b/docs/build/reference/link-code-for-kernel-mode.md @@ -1,6 +1,6 @@ --- description: "Learn more about: /KERNEL (Create kernel mode binary)." -title: "/KERNEL +title: /KERNEL ms.date: "08/25/2023" --- # /KERNEL (Create kernel mode binary) diff --git a/docs/build/reference/linker-options.md b/docs/build/reference/linker-options.md index 34590f903f..2970716fc4 100644 --- a/docs/build/reference/linker-options.md +++ b/docs/build/reference/linker-options.md @@ -39,7 +39,7 @@ You can use the [`comment`](../../preprocessor/comment-c-cpp.md) pragma to speci | [`/CLRIMAGETYPE`](clrimagetype-specify-type-of-clr-image.md) | Sets the type (IJW, pure, or safe) of a CLR image. | | [`/CLRSUPPORTLASTERROR`](clrsupportlasterror-preserve-last-error-code-for-pinvoke-calls.md) | Preserves the last error code of functions that are called through the P/Invoke mechanism. | | [`/CLRTHREADATTRIBUTE`](clrthreadattribute-set-clr-thread-attribute.md) | Specifies the threading attribute to apply to the entry point of your CLR program. | -| [`/CLRUNMANAGEDCODECHECK`](clrunmanagedcodecheck-add-suppressunmanagedcodesecurityattribute.md) | Specifies whether the linker will apply the `SuppressUnmanagedCodeSecurity` attribute to linker-generated P/Invoke stubs that call from managed code into native DLLs. | +| [`/CLRUNMANAGEDCODECHECK`](clrunmanagedcodecheck-add-suppressunmanagedcodesecurityattribute.md) | Specifies whether the linker applies the `SuppressUnmanagedCodeSecurity` attribute to linker-generated P/Invoke stubs that call from managed code into native DLLs. | | [`/DEBUG`](debug-generate-debug-info.md) | Creates debugging information. | | [`/DEBUGTYPE`](debugtype-debug-info-options.md) | Specifies which data to include in debugging information. | | [`/DEF`](def-specify-module-definition-file.md) | Passes a module-definition (.def) file to the linker. | @@ -71,7 +71,7 @@ You can use the [`comment`](../../preprocessor/comment-c-cpp.md) pragma to speci | [`/INCREMENTAL`](incremental-link-incrementally.md) | Controls incremental linking. | | [`/INFERASANLIBS`](inferasanlibs.md) | Uses inferred sanitizer libraries. | | [`/INTEGRITYCHECK`](integritycheck-require-signature-check.md) | Specifies that the module requires a signature check at load time. | -| [`/KERNEL`](kernel-mode-code-check.md) | Create a kernel mode binary. | +| [`/KERNEL`](link-code-for-kernel-mode.md) | Create a kernel mode binary. | | [`/KEYCONTAINER`](keycontainer-specify-a-key-container-to-sign-an-assembly.md) | Specifies a key container to sign an assembly. | | [`/KEYFILE`](keyfile-specify-key-or-key-pair-to-sign-an-assembly.md) | Specifies a key or key pair to sign an assembly. | | [`/LARGEADDRESSAWARE`](largeaddressaware-handle-large-addresses.md) | Tells the compiler that the application supports addresses larger than 2 gigabytes | From e343a41d008eee42e6fe7f5cf8f17d4b22e66fa9 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 28 Aug 2023 14:46:43 -0700 Subject: [PATCH 0085/1931] fix typo --- .../what-s-new-for-visual-cpp-in-visual-studio.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md index 24d93d160c..0e1e7581b8 100644 --- a/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md +++ b/docs/overview/what-s-new-for-visual-cpp-in-visual-studio.md @@ -16,11 +16,17 @@ For more information on what's new in all of Visual Studio, see [What's new in V For a summary of new C++ features in Visual Studio 17.7, see [What’s New for C++ Developers in Visual Studio 2022 17.7](https://devblogs.microsoft.com/cppblog/whats-new-for-c-developers-in-visual-studio-2022-17-7/). -Briefly, some of the new features are: faster debugging sessions and faster project load times, step-by-step visualization of macro expansion, one-click download for Windows Subsystem for Linux (WSL), improved support for Doxygen comments, C++ Build Insights for game development, and Unreal Engine project improvements such as faster IntelliSense and syntax colorization, the ability to find all Unreal Engine Blueprint references, and more. +Briefly, some of the new features are: +* Faster debugging sessions and faster project load times +* Step-by-step visualization of macro expansion +* One-click download for Windows Subsystem for Linux (WSL) +* Improved support for Doxygen comments +* C++ Build Insights for game development +* Unreal Engine project improvements such as faster IntelliSense and syntax colorization, the ability to find all Unreal Engine Blueprint references, and more. For a summary of new C++ features that are specific to game development, see [Unleashing the Power of Visual Studio 2022 for C++ Game Development](https://devblogs.microsoft.com/visualstudio/unleashing-the-power-of-visual-studio-2022-for-c-game-development/#:~:text=Unleashing%20the%20Power%20of%20Visual%20Studio%202022%20for,6%20Optimizing%20Build%20Times%20in%20Visual%20Studio%20) -For a summary of new features in the Visual Studio 17.7 IDE, see[Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). +For a summary of new features in the Visual Studio 17.7 IDE, see [Visual Studio 2022 version 17.7 Release Notes](/visualstudio/releases/2022/release-notes). ## What's new for C++ in Visual Studio version 17.6 From edddd86dce89ba0a5bb9279e3333ff0c53045332 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 29 Aug 2023 15:58:56 -0700 Subject: [PATCH 0086/1931] incorporate the updates made by balagansky-work --- docs/build/reference/zc-conformance.md | 58 +++++++++++++------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/docs/build/reference/zc-conformance.md b/docs/build/reference/zc-conformance.md index 6774cae102..717b8af5e1 100644 --- a/docs/build/reference/zc-conformance.md +++ b/docs/build/reference/zc-conformance.md @@ -1,12 +1,12 @@ --- title: "/Zc (Conformance)" description: "The /Zc conformance compiler options enable or disable support for conforming or backward-compatible behavior." -ms.date: 11/08/2022 +ms.date: 08/29/2023 helpviewer_keywords: ["/Zc compiler options [C++]", "-Zc compiler options [C++]", "Conformance compiler options", "Zc compiler options [C++]"] --- # `/Zc` (Conformance) -You can use the **`/Zc`** compiler options to specify standard or Microsoft-specific compiler behavior. +Use the **`/Zc`** compiler options to specify standard or Microsoft-specific compiler behavior. ## Syntax @@ -22,41 +22,41 @@ Here are the **`/Zc`** compiler options: | Option | Behavior | |--|--| -| [`/Zc:__cplusplus`](zc-cplusplus.md) | Enable the `__cplusplus` macro to report the supported standard (off by default). | +| [`/Zc:__cplusplus[-]`](zc-cplusplus.md) | Enable the `__cplusplus` macro to report the supported standard (off by default). | | [`/Zc:__STDC__`](zc-stdc.md) | Enable the `__STDC__` macro to report the C standard is supported (off by default). | -| [`/Zc:alignedNew`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation (on by default in C++17). | -| [`/Zc:auto`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`** (on by default). | -| [`/Zc:char8_t`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t` (off by default, except under **`/std:c++20`**). | +| [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation (off by default except when **`/std:c++17`** or later is specified). | +| [`/Zc:auto[-]`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`** (on by default). | +| [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t` (off by default except when **`/std:c++20`** or later is specified). | | [`/Zc:enumTypes[-]`](zc-enumtypes.md) | Enable Standard C++ rules for `enum` type deduction (off by default). | -| [`/Zc:externC`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions (implied by **`/permissive-`**). | -| [`/Zc:externConstexpr`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables (off by default). | -| [`/Zc:forScope`](zc-forscope-force-conformance-in-for-loop-scope.md) | Enforce Standard C++ **`for`** scoping rules (on by default). | -| [`/Zc:gotoScope`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization (implied by **`/permissive-`**). | -| [`/Zc:hiddenFriend`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules (implied by **`/permissive-`**) | -| [`/Zc:implicitNoexcept`](zc-implicitnoexcept-implicit-exception-specifiers.md) | Enable implicit **`noexcept`** on required functions (on by default). | -| [`/Zc:inline`](zc-inline-remove-unreferenced-comdat.md) | Remove unreferenced functions or data if they're COMDAT or have internal linkage only (off by default). | -| [`/Zc:lambda`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas. | -| [`/Zc:noexceptTypes`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules (on by default in C++17 or later). | -| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions (on by default under **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later). | -| [`/Zc:preprocessor`](zc-preprocessor.md) | Use the new conforming preprocessor (off by default, except in C11/C17). | -| [`/Zc:referenceBinding`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a non-const lvalue reference (off by default). | -| [`/Zc:rvalueCast`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules (off by default). | -| [`/Zc:sizedDealloc`](zc-sizeddealloc-enable-global-sized-dealloc-functions.md) | Enable C++14 global sized deallocation functions (on by default). | -| [`/Zc:strictStrings`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion (off by default). | -| [`/Zc:static_assert`](zc-static-assert.md) | strict handling of `static_assert` (implied by **`/permissive-`**). | +| [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions (off by default except when **`/permissive-`** is specified). | +| [`/Zc:externConstexpr[-]`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables (off by default). | +| [`/Zc:forScope[-]`](zc-forscope-force-conformance-in-for-loop-scope.md) | Enforce Standard C++ **`for`** scoping rules (on by default). | +| [`/Zc:gotoScope[-]`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization (off by default except when **`/permissive-`** is specified). | +| [`/Zc:hiddenFriend[-]`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules (off by default except when **`/permissive-`** is specified). | +| [`/Zc:implicitNoexcept[-]`](zc-implicitnoexcept-implicit-exception-specifiers.md) | Enable implicit **`noexcept`** on required functions (on by default). | +| [`/Zc:inline[-]`](zc-inline-remove-unreferenced-comdat.md) | Remove unreferenced functions or data if they're COMDAT or have internal linkage only (off by default). | +| [`/Zc:lambda[-]`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas (off by default, except when **`/std:c++20`** or later is specified). | +| [`/Zc:noexceptTypes[-]`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules (off by default, except when **`/std:c++17`** or later is specified). | +| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions (off by default, except when **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later is specified). | +| [`/Zc:preprocessor[-]`](zc-preprocessor.md) | Use the new conforming preprocessor (off by default, except when **`/std:c11`** or later is specified). | +| [`/Zc:referenceBinding[-]`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a non-const lvalue reference (off by default, except when **`/permissive-`** is specified). | +| [`/Zc:rvalueCast[-]`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules (off by default, except when **`/permissive-`** is specified). | +| [`/Zc:sizedDealloc[-]`](zc-sizeddealloc-enable-global-sized-dealloc-functions.md) | Enable C++14 global sized deallocation functions (on by default). | +| [`/Zc:strictStrings[-]`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion (off by default, except when **`/permissive-`** is specified). | +| [`/Zc:static_assert[-]`](zc-static-assert.md) | strict handling of `static_assert` (off by default, except when **`/permissive-`** is specified). | | [`/Zc:templateScope[-]`](zc-templatescope.md) | Enforce Standard C++ template parameter shadowing rules (off by default). | -| [`/Zc:ternary`](zc-ternary.md) | Enforce conditional operator rules on operand types (off by default). | -| [`/Zc:threadSafeInit`](zc-threadsafeinit-thread-safe-local-static-initialization.md) | Enable thread-safe local static initialization (on by default). | -| [`/Zc:throwingNew`](zc-throwingnew-assume-operator-new-throws.md) | Assume **`operator new`** throws on failure (off by default). | +| [`/Zc:ternary[-]`](zc-ternary.md) | Enforce conditional operator rules on operand types (off by default, except when **`/permissive-`** is specified). | +| [`/Zc:threadSafeInit[-]`](zc-threadsafeinit-thread-safe-local-static-initialization.md) | Enable thread-safe local static initialization (on by default). | +| [`/Zc:throwingNew[-]`](zc-throwingnew-assume-operator-new-throws.md) | Assume **`operator new`** throws on failure (off by default). | | [`/Zc:tlsGuards[-]`](zc-tlsguards.md) | Generate runtime checks for TLS variable initialization (on by default). | -| [`/Zc:trigraphs`](zc-trigraphs-trigraphs-substitution.md) | Enable trigraphs (obsolete, off by default). | -| [`/Zc:twoPhase`](zc-twophase.md) | Use non-conforming template parsing behavior (conforming by default). | -| [`/Zc:wchar_t`](zc-wchar-t-wchar-t-is-native-type.md) | **`wchar_t`** is a native type, not a typedef (on by default). | +| [`/Zc:trigraphs[-]`](zc-trigraphs-trigraphs-substitution.md) | Enable trigraphs (obsolete, off by default). | +| [`/Zc:twoPhase-`](zc-twophase.md) | Use non-conforming template parsing behavior (only applicable when **`/permissive-`** is specified, which defaults to conforming). | +| [`/Zc:wchar_t[-]`](zc-wchar-t-wchar-t-is-native-type.md) | **`wchar_t`** is a native type, not a typedef (on by default). | | [`/Zc:zeroSizeArrayNew[-]`](zc-zerosizearraynew.md) | Call member `new`/`delete` for 0-size arrays of objects (on by default). | For more information about conformance issues in MSVC, see [Nonstandard behavior](../../cpp/nonstandard-behavior.md). ## See also -[MSVC compiler options](compiler-options.md)
+[MSVC compiler options](compiler-options.md)\ [MSVC compiler command-line syntax](compiler-command-line-syntax.md) From 17f6cade5bbf8ce8f596b12c0a0f547ce05b0eea Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 29 Aug 2023 16:16:58 -0700 Subject: [PATCH 0087/1931] cleanup --- docs/build/reference/zc-conformance.md | 60 +++++++++++++------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/docs/build/reference/zc-conformance.md b/docs/build/reference/zc-conformance.md index 717b8af5e1..b556a6c80c 100644 --- a/docs/build/reference/zc-conformance.md +++ b/docs/build/reference/zc-conformance.md @@ -22,37 +22,37 @@ Here are the **`/Zc`** compiler options: | Option | Behavior | |--|--| -| [`/Zc:__cplusplus[-]`](zc-cplusplus.md) | Enable the `__cplusplus` macro to report the supported standard (off by default). | -| [`/Zc:__STDC__`](zc-stdc.md) | Enable the `__STDC__` macro to report the C standard is supported (off by default). | -| [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation (off by default except when **`/std:c++17`** or later is specified). | -| [`/Zc:auto[-]`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`** (on by default). | -| [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t` (off by default except when **`/std:c++20`** or later is specified). | -| [`/Zc:enumTypes[-]`](zc-enumtypes.md) | Enable Standard C++ rules for `enum` type deduction (off by default). | -| [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions (off by default except when **`/permissive-`** is specified). | -| [`/Zc:externConstexpr[-]`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables (off by default). | -| [`/Zc:forScope[-]`](zc-forscope-force-conformance-in-for-loop-scope.md) | Enforce Standard C++ **`for`** scoping rules (on by default). | -| [`/Zc:gotoScope[-]`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization (off by default except when **`/permissive-`** is specified). | -| [`/Zc:hiddenFriend[-]`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules (off by default except when **`/permissive-`** is specified). | -| [`/Zc:implicitNoexcept[-]`](zc-implicitnoexcept-implicit-exception-specifiers.md) | Enable implicit **`noexcept`** on required functions (on by default). | -| [`/Zc:inline[-]`](zc-inline-remove-unreferenced-comdat.md) | Remove unreferenced functions or data if they're COMDAT or have internal linkage only (off by default). | -| [`/Zc:lambda[-]`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas (off by default, except when **`/std:c++20`** or later is specified). | -| [`/Zc:noexceptTypes[-]`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules (off by default, except when **`/std:c++17`** or later is specified). | -| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions (off by default, except when **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later is specified). | -| [`/Zc:preprocessor[-]`](zc-preprocessor.md) | Use the new conforming preprocessor (off by default, except when **`/std:c11`** or later is specified). | -| [`/Zc:referenceBinding[-]`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a non-const lvalue reference (off by default, except when **`/permissive-`** is specified). | -| [`/Zc:rvalueCast[-]`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules (off by default, except when **`/permissive-`** is specified). | -| [`/Zc:sizedDealloc[-]`](zc-sizeddealloc-enable-global-sized-dealloc-functions.md) | Enable C++14 global sized deallocation functions (on by default). | -| [`/Zc:strictStrings[-]`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion (off by default, except when **`/permissive-`** is specified). | -| [`/Zc:static_assert[-]`](zc-static-assert.md) | strict handling of `static_assert` (off by default, except when **`/permissive-`** is specified). | -| [`/Zc:templateScope[-]`](zc-templatescope.md) | Enforce Standard C++ template parameter shadowing rules (off by default). | -| [`/Zc:ternary[-]`](zc-ternary.md) | Enforce conditional operator rules on operand types (off by default, except when **`/permissive-`** is specified). | -| [`/Zc:threadSafeInit[-]`](zc-threadsafeinit-thread-safe-local-static-initialization.md) | Enable thread-safe local static initialization (on by default). | -| [`/Zc:throwingNew[-]`](zc-throwingnew-assume-operator-new-throws.md) | Assume **`operator new`** throws on failure (off by default). | -| [`/Zc:tlsGuards[-]`](zc-tlsguards.md) | Generate runtime checks for TLS variable initialization (on by default). | +| [`/Zc:__cplusplus[-]`](zc-cplusplus.md) | Enable the `__cplusplus` macro to report the supported standard. Off by default. | +| [`/Zc:__STDC__`](zc-stdc.md) | Enable the `__STDC__` macro to report the C standard is supported. Off by default. | +| [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation. Off by default except when **`/std:c++17`** or later is specified. | +| [`/Zc:auto[-]`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`**. On by default. | +| [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t`. Off by default except when **`/std:c++20`** or later is specified. | +| [`/Zc:enumTypes[-]`](zc-enumtypes.md) | Enable Standard C++ rules for `enum` type deduction. Off by default. | +| [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:externConstexpr[-]`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables. Off by default. | +| [`/Zc:forScope[-]`](zc-forscope-force-conformance-in-for-loop-scope.md) | Enforce Standard C++ **`for`** scoping rules. On by default. | +| [`/Zc:gotoScope[-]`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:hiddenFriend[-]`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:implicitNoexcept[-]`](zc-implicitnoexcept-implicit-exception-specifiers.md) | Enable implicit **`noexcept`** on required functions. On by default. | +| [`/Zc:inline[-]`](zc-inline-remove-unreferenced-comdat.md) | Remove unreferenced functions or data if they're COMDAT or have internal linkage only. Off by default. | +| [`/Zc:lambda[-]`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas. Off by default except when **`/std:c++20`** or later is specified. | +| [`/Zc:noexceptTypes[-]`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules. Off by default except when **`/std:c++17`** or later is specified. | +| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions. Off by default except when **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later is specified. | +| [`/Zc:preprocessor[-]`](zc-preprocessor.md) | Use the new conforming preprocessor. Off by default except when **`/std:c11`** or later is specified. | +| [`/Zc:referenceBinding[-]`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a nonconst lvalue reference. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:rvalueCast[-]`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:sizedDealloc[-]`](zc-sizeddealloc-enable-global-sized-dealloc-functions.md) | Enable C++14 global sized deallocation functions. On by default. | +| [`/Zc:strictStrings[-]`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:static_assert[-]`](zc-static-assert.md) | strict handling of `static_assert`. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:templateScope[-]`](zc-templatescope.md) | Enforce Standard C++ template parameter shadowing rules. Off by default. | +| [`/Zc:ternary[-]`](zc-ternary.md) | Enforce conditional operator rules on operand types. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:threadSafeInit[-]`](zc-threadsafeinit-thread-safe-local-static-initialization.md) | Enable thread-safe local static initialization. On by default. | +| [`/Zc:throwingNew[-]`](zc-throwingnew-assume-operator-new-throws.md) | Assume **`operator new`** throws on failure. Off by default. | +| [`/Zc:tlsGuards[-]`](zc-tlsguards.md) | Generate runtime checks for TLS variable initialization. On by default. | | [`/Zc:trigraphs[-]`](zc-trigraphs-trigraphs-substitution.md) | Enable trigraphs (obsolete, off by default). | -| [`/Zc:twoPhase-`](zc-twophase.md) | Use non-conforming template parsing behavior (only applicable when **`/permissive-`** is specified, which defaults to conforming). | -| [`/Zc:wchar_t[-]`](zc-wchar-t-wchar-t-is-native-type.md) | **`wchar_t`** is a native type, not a typedef (on by default). | -| [`/Zc:zeroSizeArrayNew[-]`](zc-zerosizearraynew.md) | Call member `new`/`delete` for 0-size arrays of objects (on by default). | +| [`/Zc:twoPhase-`](zc-twophase.md) | Use nonconforming template parsing behavior (only applicable when **`/permissive-`** is specified, which defaults to conforming). | +| [`/Zc:wchar_t[-]`](zc-wchar-t-wchar-t-is-native-type.md) | **`wchar_t`** is a native type, not a typedef. On by default. | +| [`/Zc:zeroSizeArrayNew[-]`](zc-zerosizearraynew.md) | Call member `new`/`delete` for 0-size arrays of objects. On by default. | For more information about conformance issues in MSVC, see [Nonstandard behavior](../../cpp/nonstandard-behavior.md). From 32c98c9309fa6b6c40bb15cafa7215eb1b947410 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 29 Aug 2023 16:29:49 -0700 Subject: [PATCH 0088/1931] one more simplification --- docs/build/reference/zc-conformance.md | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/build/reference/zc-conformance.md b/docs/build/reference/zc-conformance.md index b556a6c80c..e575b1dfdd 100644 --- a/docs/build/reference/zc-conformance.md +++ b/docs/build/reference/zc-conformance.md @@ -24,28 +24,28 @@ Here are the **`/Zc`** compiler options: |--|--| | [`/Zc:__cplusplus[-]`](zc-cplusplus.md) | Enable the `__cplusplus` macro to report the supported standard. Off by default. | | [`/Zc:__STDC__`](zc-stdc.md) | Enable the `__STDC__` macro to report the C standard is supported. Off by default. | -| [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation. Off by default except when **`/std:c++17`** or later is specified. | +| [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation. Off by default unless **`/std:c++17`** or later is specified. | | [`/Zc:auto[-]`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`**. On by default. | -| [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t`. Off by default except when **`/std:c++20`** or later is specified. | +| [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t`. Off by default unless **`/std:c++20`** or later is specified. | | [`/Zc:enumTypes[-]`](zc-enumtypes.md) | Enable Standard C++ rules for `enum` type deduction. Off by default. | -| [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions. Off by default unless **`/permissive-`** is specified. | | [`/Zc:externConstexpr[-]`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables. Off by default. | | [`/Zc:forScope[-]`](zc-forscope-force-conformance-in-for-loop-scope.md) | Enforce Standard C++ **`for`** scoping rules. On by default. | -| [`/Zc:gotoScope[-]`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization. Off by default except when **`/permissive-`** is specified. | -| [`/Zc:hiddenFriend[-]`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:gotoScope[-]`](zc-gotoscope.md) | Enforce Standard C++ **`goto`** rules around local variable initialization. Off by default unless **`/permissive-`** is specified. | +| [`/Zc:hiddenFriend[-]`](zc-hiddenfriend.md) | Enforce Standard C++ hidden friend rules. Off by default unless **`/permissive-`** is specified. | | [`/Zc:implicitNoexcept[-]`](zc-implicitnoexcept-implicit-exception-specifiers.md) | Enable implicit **`noexcept`** on required functions. On by default. | | [`/Zc:inline[-]`](zc-inline-remove-unreferenced-comdat.md) | Remove unreferenced functions or data if they're COMDAT or have internal linkage only. Off by default. | -| [`/Zc:lambda[-]`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas. Off by default except when **`/std:c++20`** or later is specified. | -| [`/Zc:noexceptTypes[-]`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules. Off by default except when **`/std:c++17`** or later is specified. | -| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions. Off by default except when **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later is specified. | -| [`/Zc:preprocessor[-]`](zc-preprocessor.md) | Use the new conforming preprocessor. Off by default except when **`/std:c11`** or later is specified. | -| [`/Zc:referenceBinding[-]`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a nonconst lvalue reference. Off by default except when **`/permissive-`** is specified. | -| [`/Zc:rvalueCast[-]`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:lambda[-]`](zc-lambda.md) | Enable new lambda processor for conformance-mode syntactic checks in generic lambdas. Off by default unless **`/std:c++20`** or later is specified. | +| [`/Zc:noexceptTypes[-]`](zc-noexcepttypes.md) | Enforce C++17 **`noexcept`** rules. Off by default unless **`/std:c++17`** or later is specified. | +| [`/Zc:nrvo[-]`](zc-nrvo.md) | Enable optional copy and move elisions. Off by default unless **`/O2`**, **`/permissive-`**, or **`/std:c++20`** or later is specified. | +| [`/Zc:preprocessor[-]`](zc-preprocessor.md) | Use the new conforming preprocessor. Off by default unless **`/std:c11`** or later is specified. | +| [`/Zc:referenceBinding[-]`](zc-referencebinding-enforce-reference-binding-rules.md) | A UDT temporary won't bind to a nonconst lvalue reference. Off by default unless **`/permissive-`** is specified. | +| [`/Zc:rvalueCast[-]`](zc-rvaluecast-enforce-type-conversion-rules.md) | Enforce Standard C++ explicit type conversion rules. Off by default unless **`/permissive-`** is specified. | | [`/Zc:sizedDealloc[-]`](zc-sizeddealloc-enable-global-sized-dealloc-functions.md) | Enable C++14 global sized deallocation functions. On by default. | -| [`/Zc:strictStrings[-]`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion. Off by default except when **`/permissive-`** is specified. | -| [`/Zc:static_assert[-]`](zc-static-assert.md) | strict handling of `static_assert`. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:strictStrings[-]`](zc-strictstrings-disable-string-literal-type-conversion.md) | Disable string-literal to `char*` or `wchar_t*` conversion. Off by default unless **`/permissive-`** is specified. | +| [`/Zc:static_assert[-]`](zc-static-assert.md) | strict handling of `static_assert`. Off by default unless **`/permissive-`** is specified. | | [`/Zc:templateScope[-]`](zc-templatescope.md) | Enforce Standard C++ template parameter shadowing rules. Off by default. | -| [`/Zc:ternary[-]`](zc-ternary.md) | Enforce conditional operator rules on operand types. Off by default except when **`/permissive-`** is specified. | +| [`/Zc:ternary[-]`](zc-ternary.md) | Enforce conditional operator rules on operand types. Off by default unless **`/permissive-`** is specified. | | [`/Zc:threadSafeInit[-]`](zc-threadsafeinit-thread-safe-local-static-initialization.md) | Enable thread-safe local static initialization. On by default. | | [`/Zc:throwingNew[-]`](zc-throwingnew-assume-operator-new-throws.md) | Assume **`operator new`** throws on failure. Off by default. | | [`/Zc:tlsGuards[-]`](zc-tlsguards.md) | Generate runtime checks for TLS variable initialization. On by default. | From dcb828fae44f23cc5f3507ef1b28b16dc9801ea2 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 29 Aug 2023 16:42:47 -0700 Subject: [PATCH 0089/1931] Clarify a sentence in another topic while I am in the same folder, per customer request --- .../integritycheck-require-signature-check.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/build/reference/integritycheck-require-signature-check.md b/docs/build/reference/integritycheck-require-signature-check.md index 41e887d9ea..48bb83df1e 100644 --- a/docs/build/reference/integritycheck-require-signature-check.md +++ b/docs/build/reference/integritycheck-require-signature-check.md @@ -1,7 +1,7 @@ --- description: "Learn more about: /INTEGRITYCHECK (Require signature check)" title: "/INTEGRITYCHECK (Require signature check)" -ms.date: 04/21/2021 +ms.date: 08/29/2023 --- # `/INTEGRITYCHECK` (Require signature check) @@ -25,14 +25,14 @@ Microsoft has new signing guidance for DLL and executable files linked by using 1. Select the **Configuration Properties** > **Linker** > **Command Line** property page. -1. To build an image which requires digital signature verification to be loaded, add *`/INTEGRITYCHECK`* to the **Additional Options** command line. By default, **`/INTEGRITYCHECK`** is off. +1. To create a digitally-signed image, include `/INTEGRITYCHECK` in the **Additional Options** command line. A digitally-signed image must pass a verification check before it is loaded. This feature is disabled by default. 1. Choose **OK** to save your changes. ## See also -[MSVC linker reference](linking.md)
-[MSVC linker options](linker-options.md)
-[Forced integrity signing of portable executable (PE) files](https://social.technet.microsoft.com/wiki/contents/articles/255.forced-integrity-signing-of-portable-executable-pe-files.aspx)
-[Kernel-mode code signing requirements](/windows-hardware/drivers/install/kernel-mode-code-signing-requirements--windows-vista-and-later-)
+[MSVC linker reference](linking.md)\ +[MSVC linker options](linker-options.md)\ +[Forced integrity signing of portable executable (PE) files](https://social.technet.microsoft.com/wiki/contents/articles/255.forced-integrity-signing-of-portable-executable-pe-files.aspx)\ +[Kernel-mode code signing requirements](/windows-hardware/drivers/install/kernel-mode-code-signing-requirements--windows-vista-and-later-)\ [AppInit DLLs and Secure Boot](/windows/win32/dlls/secure-boot-and-appinit-dlls) From 5cb2411361cf013e24a334c2dd530caf1e479987 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 29 Aug 2023 16:46:34 -0700 Subject: [PATCH 0090/1931] acrolinx --- .../build/reference/integritycheck-require-signature-check.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/build/reference/integritycheck-require-signature-check.md b/docs/build/reference/integritycheck-require-signature-check.md index 48bb83df1e..b11cada03e 100644 --- a/docs/build/reference/integritycheck-require-signature-check.md +++ b/docs/build/reference/integritycheck-require-signature-check.md @@ -13,7 +13,7 @@ Specifies that the digital signature of the binary image must be checked at load By default, **`/INTEGRITYCHECK`** is off. -The **`/INTEGRITYCHECK`** linker option sets a flag, `IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY`, in the PE header of the DLL file or executable file. This flag tells the memory manager to check for a digital signature in order to load the image in Windows. This option must be set for both 32-bit and 64-bit DLLs that are loaded by certain Windows features. It's recommended for all device drivers on Windows Vista, Windows Server 2008, and all later versions of Windows and Windows Server. Versions of Windows prior to Windows Vista ignore this flag. For more information, see [Forced Integrity Signing of Portable Executable (PE) files](https://social.technet.microsoft.com/wiki/contents/articles/255.forced-integrity-signing-of-portable-executable-pe-files.aspx). +The **`/INTEGRITYCHECK`** linker option sets a flag, `IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY`, in the PE header of the DLL file or executable file. This flag tells the memory manager to check for a digital signature in order to load the image in Windows. This option must be set for both 32-bit and 64-bit DLLs that certain Windows features load. It's recommended for all device drivers on Windows Vista, Windows Server 2008, and all later versions of Windows and Windows Server. Versions of Windows prior to Windows Vista ignore this flag. For more information, see [Forced Integrity Signing of Portable Executable (PE) files](https://social.technet.microsoft.com/wiki/contents/articles/255.forced-integrity-signing-of-portable-executable-pe-files.aspx). ### Signing `/INTEGRITYCHECK` files @@ -25,7 +25,7 @@ Microsoft has new signing guidance for DLL and executable files linked by using 1. Select the **Configuration Properties** > **Linker** > **Command Line** property page. -1. To create a digitally-signed image, include `/INTEGRITYCHECK` in the **Additional Options** command line. A digitally-signed image must pass a verification check before it is loaded. This feature is disabled by default. +1. To create a digitally signed image, include `/INTEGRITYCHECK` in the **Additional Options** command line. A digitally signed image must pass a verification check before it's loaded. This feature is disabled by default. 1. Choose **OK** to save your changes. From 1878e15a709726c70ce2796a507de545df72f113 Mon Sep 17 00:00:00 2001 From: "learn-build-service-prod[bot]" <113403604+learn-build-service-prod[bot]@users.noreply.github.com> Date: Fri, 1 Sep 2023 10:26:40 -0700 Subject: [PATCH 0091/1931] Repo sync for protected CLA branch (#4693) * add /KERNEL topic * fix links * fix typo --------- Co-authored-by: TylerMSFT Co-authored-by: Diana Richards <103777760+v-dirichards@users.noreply.github.com> Co-authored-by: prmerger-automator[bot] <40007230+prmerger-automator[bot]@users.noreply.github.com> Co-authored-by: Phil Co-authored-by: Learn Build Service GitHub App From 853e1e278a913c221e928e1e7660460dad6c4f68 Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Fri, 1 Sep 2023 10:58:37 -0700 Subject: [PATCH 0092/1931] add /zc:checkGwOdr switch doc (#5024) * add /zc:checkGwOdr switch doc * typo * fix title * typo * code escape * code escape * fix link * fix casing * file rename --------- Co-authored-by: TylerMSFT --- docs/build/reference/zc-check-gwodr.md | 34 ++++++++++++++++++++++++++ docs/build/reference/zc-conformance.md | 3 ++- docs/build/toc.yml | 6 +++-- 3 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 docs/build/reference/zc-check-gwodr.md diff --git a/docs/build/reference/zc-check-gwodr.md b/docs/build/reference/zc-check-gwodr.md new file mode 100644 index 0000000000..2bec0383a7 --- /dev/null +++ b/docs/build/reference/zc-check-gwodr.md @@ -0,0 +1,34 @@ +--- +title: "/Zc:zc-checkGwOdr (Enforce Standard C++ ODR violations under /Gw)" +description: "Learn about the Microsoft C++ /Zc:checkGwOdr compiler option for improving C++ standards conformance when using /Gw (Optimize global data)" +ms.date: 08/31/2023 +f1_keywords: ["/Zc:checkGwOdr"] +helpviewer_keywords: ["/Zc:checkGwOdr", "Zc:checkGwOdr", "-Zc:checkGwOdr"] +--- +# `/Zc:checkGwOdr` (Enforce Standard C++ ODR violations under `/Gw`) + +This switch enforces C++ standards conformance when using [`/Gw` (Optimize global data)](gw-optimize-global-data.md). When using `/Gw`, certain One Definition Rule (ODR) violations are ignored. This flag ensures that the appropriate errors are raised. + +## Syntax + +> **`/Zc:checkGwOdr`**\[**`-`**] + +## Remarks + +This switch is off by default. + +To see an example of ODR violations that are ignored when using `/Gw`, see [Standards conformance improvements to /Gw](https://devblogs.microsoft.com/cppblog/standards-conformance-improvements-to-gw-in-visual-studio-version-17-5-preview-2/). + +### To set this compiler option in the Visual Studio development environment + +1. Open the project's **Property Pages** dialog box. For details, see [Set C++ compiler and build properties in Visual Studio](../working-with-project-properties.md). + +1. Select the **Configuration Properties** > **C/C++** > **Command Line** property page. + +1. Modify the **Additional Options** property to include *`/Zc:checkGwOdr`* or *`/Zc:checkGwOdr-`* and then choose **OK**. + +## See also + +[`/Zc` (Conformance)](zc-conformance.md)\ +[One Definition Rule (ODR)](https://en.wikipedia.org/wiki/One_Definition_Rule)\ +[Standards conformance improvements to /Gw](https://devblogs.microsoft.com/cppblog/standards-conformance-improvements-to-gw-in-visual-studio-version-17-5-preview-2/) diff --git a/docs/build/reference/zc-conformance.md b/docs/build/reference/zc-conformance.md index e575b1dfdd..efa980dbb7 100644 --- a/docs/build/reference/zc-conformance.md +++ b/docs/build/reference/zc-conformance.md @@ -1,7 +1,7 @@ --- title: "/Zc (Conformance)" description: "The /Zc conformance compiler options enable or disable support for conforming or backward-compatible behavior." -ms.date: 08/29/2023 +ms.date: 08/31/2023 helpviewer_keywords: ["/Zc compiler options [C++]", "-Zc compiler options [C++]", "Conformance compiler options", "Zc compiler options [C++]"] --- # `/Zc` (Conformance) @@ -27,6 +27,7 @@ Here are the **`/Zc`** compiler options: | [`/Zc:alignedNew[-]`](zc-alignednew.md) | Enable C++17 over-aligned dynamic allocation. Off by default unless **`/std:c++17`** or later is specified. | | [`/Zc:auto[-]`](zc-auto-deduce-variable-type.md) | Enforce the new Standard C++ meaning for **`auto`**. On by default. | | [`/Zc:char8_t[-]`](zc-char8-t.md) | Enable or disable C++20 native `u8` literal support as `const char8_t`. Off by default unless **`/std:c++20`** or later is specified. | +| [`/Zc:checkGwOdr[-]`](zc-check-gwodr.md) | Enforce Standard C++ ODR violations under `/Gw`. | | [`/Zc:enumTypes[-]`](zc-enumtypes.md) | Enable Standard C++ rules for `enum` type deduction. Off by default. | | [`/Zc:externC[-]`](zc-externc.md) | Enforce Standard C++ rules for `extern "C"` functions. Off by default unless **`/permissive-`** is specified. | | [`/Zc:externConstexpr[-]`](zc-externconstexpr.md) | Enable external linkage for **`constexpr`** variables. Off by default. | diff --git a/docs/build/toc.yml b/docs/build/toc.yml index 4224b0bfde..6930d7bad4 100644 --- a/docs/build/toc.yml +++ b/docs/build/toc.yml @@ -773,7 +773,7 @@ items: - name: /Zc (Conformance) expanded: false items: - - name: /Zc (Conformance) + - name: "/Zc (Conformance)" href: ../build/reference/zc-conformance.md - name: "/Zc:__cplusplus (Enable updated __cplusplus macro)" href: ../build/reference/zc-cplusplus.md @@ -785,7 +785,9 @@ items: href: ../build/reference/zc-auto-deduce-variable-type.md - name: "/Zc:char8_t (Enable C++20 char8_t type)" href: ../build/reference/zc-char8-t.md - - name: '/Zc:enumTypes (Enable enum type deduction)' + - name: "/Zc:checkGwOdr (Enforce Standard C++ ODR violations under /Gw)" + href: ../build/reference/zc-check-gwodr.md + - name: "/Zc:enumTypes (Enable enum type deduction)" href: ../build/reference/zc-enumtypes.md - name: '/Zc:externC (Use Standard C++ extern "C" rules)' href: ../build/reference/zc-externc.md From 43007d5ec90e97680e022ee5b95377cd954046bc Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 6 Sep 2023 15:43:07 -0700 Subject: [PATCH 0093/1931] draft --- docs/ide/include-cleanup-overview.md | 24 ++++++++++++++++++++++++ docs/ide/toc.yml | 2 ++ 2 files changed, 26 insertions(+) create mode 100644 docs/ide/include-cleanup-overview.md diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md new file mode 100644 index 0000000000..654a318e36 --- /dev/null +++ b/docs/ide/include-cleanup-overview.md @@ -0,0 +1,24 @@ +--- +title: "Cleanup #includes in C++ code in Visual Studio" +description: "Use the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." +ms.date: 09/10/2023 +ms.topic: "overview" +ms.custom: intro-overview +--- +# Cleanup #includes in C++ code in Visual Studio + +Starting in Visual Studio 17.8, Visual Studio provides #include cleanup to improves the quality of your code. It generates suggestions to remove unused headers, but can also add headers for code that you are using in your project. + + + + Our suggested workflow is to first go through the direct include suggestions to add direct headers where indirect headers are used, followed by removing the unused includes. + +## IntelliSense + +IntelliSense is a powerful code completion tool that suggests symbols and code snippets for you as you type. C++ IntelliSense in Visual Studio runs in real time, analyzing your codebase as you update it and providing recommendations. As you type more characters, the list of recommended results narrows down. + +![Screenshot of the C plus plus member list drop down showing the methods available for string such as append, assign, and so on.](../ide/media/cpp-statement-completion.png) + +## See Also + +[Navigate your C++ code base in Visual Studio](navigate-code-cpp.md) \ No newline at end of file diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index a149cbb552..fcb8b911f3 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -8,6 +8,8 @@ items: href: ../ide/writing-and-refactoring-code-cpp.md - name: Navigate C++ code href: ../ide/navigate-code-cpp.md + - name: Include cleanup + href: ../ide/include-cleanup.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md - name: Collaborate using Live Share for C++ From 1519a0fb72163773f064e4de5dbc986f75b5235e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 7 Sep 2023 14:44:47 -0700 Subject: [PATCH 0094/1931] add Herb Sutter's doc on safe c++ coding --- .../build-reliable-secure-programs.md | 433 ++++++++++++++++++ docs/code-quality/toc.yml | 2 + docs/index.yml | 2 + 3 files changed, 437 insertions(+) create mode 100644 docs/code-quality/build-reliable-secure-programs.md diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md new file mode 100644 index 0000000000..5d6e5a0d91 --- /dev/null +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -0,0 +1,433 @@ +--- +description: "Learn more about: Building reliable and secure apps in C++ by applying NISTIR 8397 guidelines." +title: Build reliable and secure apps in C++ +ms.date: 09/07/2023 +ms.topic: "conceptual" +--- + +# Build reliable and secure apps in C++ + +The United States government publication [NISTIR 8397: Guidelines on Minimum Standards for Developer Verification of Software](https://nvlpubs.nist.gov/nistpubs/ir/2021/NIST.IR.8397.pdf) contains excellent guidance on how to build reliable and secure software in any programming language. + +This document follows the same structure as NISTIR 8397. Each section summarizes how to use Microsoft developer products for C++ and other languages to meet that section's security needs, and provides guidance to get the most value in each area. + +## 2.1 Threat modeling + +**Summary** + +Threat modeling is valuable, especially when applied in a way that scales to meet your development needs and that reduces noise. + +**Recommendations** + +Threat modeling is best used as one part of a dynamic Security Development Lifecycle (SDL) approach that can meet individual development teams' needs and enhance security while minimizing wasted cycles and blocking. We suggest that for your product as a whole, for a specific feature, or for a major design or implementation change: + +1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. +1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. +1. Apply threat modeling early (as with all security requirements), when there is still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security (see below). Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. +1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This enables better automated risk assessment and focusing of security efforts on the specific components or features that change. +1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](https://learn.microsoft.com/azure/security/develop/threat-modeling-tool). + +**Supporting factors and practices** + +To properly apply threat modeling and avoid underuse/overuse, we have found that the following core concepts need to be addressed first. + +*Development approach* + +First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change has a threat model. Instead, consider having a security requirements questionnaire that focuses on specific questions to ask about the feature to determine what future aspects of your SDL apply. For example: +- Does the feature make a major change in design of how we provide customer isolation in a multi-tenant environment? If so, consider performing a full threat model. +- Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. +- Is this primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. + +Having a security questionnaire affixed to a security requirements phase that ties to when the development team is making functional requirements for a feature allows us to apply the right SDL techniques to the unit of development and the SDLC timelines that our development partners are using, avoiding unnecessary blocking and wasted cycles. + +*Product inventory* + +Second, maintain a strong asset inventory of the products you are tasked with assessing. Products are growing in complexity. We now have devices in Operational Technology (OT) spaces that have connectivity with sensors (such as passenger rail and vehicles), bus-based networks that talk to other IoT / OT components in the vehicle (such as CANBUS or PROFIBUS), wireless/cellular/Bluetooth for communication with customer devices and cloud back ends, machine learning in the cloud feeding back into the device or a fleet management application, and so on. In such a complex product, it's generally not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. + +*Granularity and integration* + +Establish compliance systems that let you establish and measure compliance metrics for feature level development (generally with higher frequency and smaller granularity, sometimes even on the developer's system or at code commit/merge time), and tie them into asset inventory systems that let you periodically evaluate security for the broader product a feature or component is being consumed by (typically with less frequency and broader granularity, such as at module or system testing time). + +*Scale* + +Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. This lets you evaluate them for patterns, and make intelligent decisions on how to refine the product security program on a regular basis. Ideally, you can combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), and this can be translated into what security teams should focus on to maximize return on threat modeling investment. + +## 2.2 Automated testing + +**Summary** + +Automated tests are an important way to ensure the quality and safety of your code. They are an integral piece in supporting other areas mentioned in this document, such as Threat Modeling. When paired with other secure coding practices, they help to protect against bugs and vulnerabilities being introduced into the codebase. + +**Key attributes** + +Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should be accompanied by corresponding tests to ensure the long-term security and reliability of the code when possible. The best way to ensure automated tests are run and cover all areas is to have them running in as many environments as possible: + +- The first place they should run is on the machine that is making the changes. This is most easily done within the IDE that is being used for editing, or as a script on the command line as the developer makes the changes. +- The next place they should run is as part of the pull request commit/merge process. +- The last place to run tests is as part of a Continuous Integration and Continuous Deployment (CI/CD) pipeline, or on your release candidate builds. + +The scope of the tests should increase at each step, with the last step providing full coverage for anything the other steps may miss. + +**Continuous use and maintenance** + +Test reliability is an important part of maintaining the effectiveness of the testing suite. Test failures should be assigned and investigated, with potential security issues getting high priority and getting updated within a prompt and predetermined timeframe. Ignoring test failures should not be a common practice, but should require strong justification and approval. Test failures due to issues within the test suite itself should be treated the same as other failures, as this presents a lapse in coverage and can cause product issues to be missed. + +**Kinds of tests, especially unit tests** + +There are several types of automated tests, and while not all are applicable to all applications, a good test suite will contain a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of these can be run quickly and often. As part of the wider test infrastructure running remotely, these tests can also easily be run on multiple machine hardware setups, which can catch issues that cannot always be reproduced on a single developer's machine. + +**Visual Studio** + +Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks and options to install extensions for more frameworks. This is helpful for running a subset of tests covering the code you're working on, as well as making it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, as well as providing helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp.md) + +**In Azure and GitHub CI/CD** + +Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. These validations are easily set up through Azure DevOps or GitHub [Actions](https://docs.github.com/en/actions) and can be set to run automatically and block checking in code if any of these validations fails. Having these blockers helps ensure that all code being checked in is secure based on these more rigorous checks being run. This can be done by leveraging Azure Pipelines and Azure DevOps Build Validation, as described here: + +- [Git branch policies and settings - Azure Repos](https://learn.microsoft.com/azure/devops/repos/git/branch-policies?view=azure-devops&tabs=browser#build-validation) +- [Defining the mergeability of pull requests | GitHub Docs](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests) + +## 2.3 Code-based, or static, analysis + +**Summary** Static code/binary analysis should be enabled by default, to be secure by default. Static analysis is a compiler technology that analyzes a program (either in source code form or in compiled executable form) for required safety and security policies when it is being built, not at execution time when an exploit can occur on the customer's machine. + +**Recommendations** Microsoft recommends that you: + +- Enable static analysis for all C++ programs, for both the input source code (pre-compilation) and the executable binaries (post-compilation). Note that "enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. +- Incorporate static analysis into CI pipelines as a form of testing. +- Be aware that static analysis by definition comes with false positives, and be prepared to incorporate that fact into your quality feedback loop. Be quick to enable all low-false-positive warnings up front. Then be proactive to gradually increase the number of rules for which your code base will compile warning-clean as you regularly add more rules that flag important bugs at the expense of gradually higher false positives (initially, before the code base has been cleaned for those too). +- Always use the latest supported versions of Visual Studio, and set up your engineering environment to be able to quickly consume the latest patch releases as soon as they become available, without delaying to the next development stage/cycle. + +**Key tools** Be aware of and use the following: + +- [Code analysis documentation - C++ and .NET](visualstudio/code-quality.md) +- [`/analyze` - Visual C++ compiler](../build/reference/analyze-code-analysis.md) +- [`/W4` and `/WX` - Visual C++ compiler](../build/reference/compiler-option-warning-level.md) +- [Use the C++ Core Guidelines Checkers](using-the-cpp-core-guidelines-checkers.md) +- [CodeQL | GitHub](https://codeql.github.com/) +- [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) +- See also (Windows only): [SAL annotations](../c-runtime-library/sal-annotations.md) + +Notes: + +- `/analyze` enables static analysis of C++ code at compile time to identify critical security and reliability code vulnerabilities. It should be enabled throughout a C++ program's entire development timeline. Start by enabling at least the "Microsoft Native Recommended" by default as a minimum baseline, then consult the documentation for how to specify additional rules beyond those, notably the C++ Core Guidelines rules, as required by your engineering policies. The source code Static Analysis capability is available in both the Visual C++ IDE and in the command-line Build Tools. +- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). Note that these include warnings from the compiler back-end that can and do find uninitialized uses that other static analysis tools cannot, because the compiler does perform interprocedural analysis and inlining when the checking runs. +- BinSkim binary analysis ensures that projects enable a broad range of security features and generate outputs (such as PDBs) that maximize chain-of-custody verification and efficiency of security response. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. Consult the BinSkim User Guide linked above for how to install and run the binary analyzer, and the full list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Microsoft recommends caution and selectively fixing issues reported as "warnings," as resolving these problems may have performance implications or simply may not be required for all scenarios. + +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Running source code analysis in context of the local developer machine will prevent introduction of issues early and lower overall costs. The rate-of-introduction of binary-level issues tends to be slower than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. + +## 2.4 Review for hardcoded secrets + +**Summary** + +Don't hardcode secrets within software. To find and remove secrets from the source code, it is most efficient to use a reliable tool that can scan the entire source code and find them. Once found, move them to a safe place following the guideline for secure storage and use of secrets. + +**Problem** + +Secrets for software refer to entities that establish identity and provide access to resources or are used to protect important or sensitive data by signing or encrypting the data (for example, passwords, storage keys, connection strings, private keys). It is tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets (either in plain text or encrypted but with easily discoverable decryption key) can lead to severe or catastrophic security incidents as they are easily discovered and can be used to compromise your service and data. + +**Prevention** + +Secrets hardcoded in source code (as plain text or encrypted blob) are a security vulnerability. Here are general guidelines on how to avoid secrets in the source code: + +- Use a pre-checkin tool to scan and catch potential hardcoded secrets in code prior submitting to source control. +- Don't put clear text credentials in source code or configuration files. +- Don't store clear text credentials in SharePoint, OneNote, file shares, and so on. Or share them via email, IM, and so on. +- Don't encrypt a secret with an easily discoverable decryption key. For example, don't store a PFX file along with a file that contains its password. +- Don't encrypt a secret with a weak decryption. For example, don't encrypt a PFX file with a weak or common password. +- Avoid putting encrypted credentials in source code. Instead, use placeholders in your source that will be replaced with secrets from approved stores using the capabilities provided by your chosen deployment system. See below for more details. +- Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target non-production systems as they are less well managed, then use them to pivot into production. +- Don't share secrets between deployments (for example, testing, staging, production). + +While not directly related to hardcoded secrets, also remember securing secrets for your test, development, and production: + +- Rotate your secrets periodically and whenever they may have been exposed. Having a demonstrated ability to rotate/redeploy secrets is evidence of a secure system. More notably, the absence of this capability is even stronger evidence of an inevitable vulnerability. +- Don't give in to the common developer rationale that "my test credentials don't create risk." In practice, they nearly always do. +- Consider moving away from secrets (for example, passwords, bearer keys) entirely in preference of RBAC/identity-driven solutions as a good engineering solution that can sidestep secret mismanagement entirely. + +**Detection** + +Legacy components of your product may contain hidden hardcoded secrets in their source code. Sometimes secrets from developers' desktop machines can creep into remote branch and merge into the release branch, leaking secrets unintentionally. To discover secrets that might be hiding in your source code, you can use tools that can scan your code for hardcoded secrets: + +- [Microsoft sarif-pattern-matcher tool](https://github.com/microsoft/sarif-pattern-matcher) + +**Remediation** + +When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. If there is a running system that needs to stay up, if a secret manager needs to be put into play, remediation should follow these steps: + +1. If remediation allows switch-over to managed identities or requires dropping in a secret manager such as Azure Key Vault (AKV), complete that work, and redeploy with updated identity/key. +1. Invalidate the exposed secret. +1. Perform auditing/risk assessment of potential damage due to compromise. + +To safeguard cryptographic keys and other secrets used by cloud apps and services, use [Azure Key Vault](https://azure.microsoft.com/products/key-vault). + +If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. + +Remove the (now-invalidated) secrets from your source code and replace them with alternative methods that won't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using MSI, dMSI, Azure AD, dKDS, and so on. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more details, see: + +- [MSI: Server to server authentication](https://review.learn.microsoft.com/identity/microsoft-identity-platform/msa-server-to-server?branch=main) +- [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) +- [Azure AD: Implementing auto-rotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) +- [dKDS: Datacenter key distribution service](https://msazure.visualstudio.com/AzureCoreSecurityServices/_wiki/wikis/AzureCoreSecurityServices.wiki/20522/Key-Distribution-Service-(dKDS)) +- [Key Vault & dSMS & Secrets Management: What is certificate autorotation?](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/getstartedcerts#how-do-i-procure-and-store-the-cert) + +**Azure DevOps (AzDO)** + +AzDO users can scan their code through Microsoft Defender for DevOps for known types of secrets. Defender for DevOps, a service available in Defender for Cloud, empowers security teams to manage DevOps security across multi-pipeline environments. Defender for DevOps is current in preview, available for free trial. Defender for DevOps provides the scanning service through GitHub Advanced Security for Azure DevOps (GHAS for AzDO). For more details on how to detect hardcoded secrets in code in Azure DevOps, see "Detect exposed secrets in code" in the following list of links: + +- [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) +- [GitHub advanced security for Azure DevOps (GHAS for AzDO) | GitHub](https://partner.github.com/2022/10/12/azure-devops-article.html) +- [Detect exposed secrets in code](https://learn.microsoft.com/azure/defender-for-cloud/detect-exposed-secrets) + +**In GitHub** + +Secret scanning is available on GitHub.com in two forms: + +- *Secret scanning alerts for partners.* Runs automatically on all public repositories. Any strings that match patterns that were provided by secret scanning partners are reported directly to the relevant partner. +- *Secret scanning alerts for users.* You can enable and configure additional scanning for repositories owned by organizations that use GitHub Enterprise Cloud and have a license for GitHub Advanced Security. This includes private and internal repositories. + +GitHub provides known patterns of secrets for partners and users that can be configured to meet your needs. For more details, please see: + +- [Secret scanning patterns](https://docs.github.com/en/code-security/secret-scanning/secret-scanning-patterns#supported-secrets-for-user-alerts) +- [About secret scanning in GitHub](https://docs.github.com/en/enterprise-cloud@latest/code-security/secret-scanning/about-secret-scanning) + +> [!NOTE] +> During the Microsoft Defender for DevOps preview period, GitHub Advanced Security for Azure DevOps (GHAS for AzDO) is also providing a free trial of secret scanning. GitHub Advanced Security for Azure DevOps brings the same secret scanning, dependency scanning and CodeQL code scanning solutions already available for GitHub users and natively integrates them into Azure DevOps to protect your Azure Repos and Pipelines. + +**Additional resources** + +- [Credential Scanning | Microsoft Code With Engineering Playbook](https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/credential_scanning/). +- [detect-secrets: Credential scanning tool | GitHub](https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets/) - an aptly named module for detecting secrets within a code base. +- [Running detect-secrets in Azure DevOps pipelines](https://microsoft.github.io/code-with-engineering-playbook/continuous-integration/dev-sec-ops/secret-management/recipes/detect-secrets-ado/). +- [Git-secrets | GitHub awslabs](https://github.com/awslabs/git-secrets) - prevents you from committing passwords and other sensitive information to a git repository. +- [Secrets Management | Microsoft Code with Engineering Playbook](https://microsoft.github.io/code-with-engineering-playbook/continuous-delivery/secrets-management/) - provides general guidelines on how secrets should be managed. + +## 2.5 Run with language- and OS-provided checks and protection + +**Summary** + +Binary hardening is done by applying compile-time security controls. These include mitigations that prevent exploitable vulnerabilities in code, enable runtime detections that trigger security defenses on exploitation, and enable data production and archiving intended to limit damage caused by security incidents. Binary consumers must opt into Windows security features to gain maximal benefit from hardening. + +Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains a public OSS binary checker, BinSkim, that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) + +Binary-level controls differ according to where they are applied in the engineering process. It is useful to distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. + +Developer settings will tend towards enabling maximal static analysis, the production of private data to accelerate debugging, and so on. Release builds will be tuned to an appropriate combination of security, performance, and other code generation concerns. Release processes must be configured to properly generate and manage public vs. privately consumed build data (for example, public vs. private symbols). + +**Stay current: Always use up-to-date compilers and tools** + +Compile all code with current toolsets to benefit from up-to-date language support, static analysis, code generation and security controls. Because compilers impact every generated component, the potential for regression on tool update is relatively high. Using outdated compilers creates a particular risk for corrective action in the event of a security incident because teams may not be able to rapidly upgrade compilers in response. Microsoft recommends that teams develop the facility to regularly refresh and test compiler updates. + +**Use secure development methods, language versions, frameworks/APIs** + +Code should utilize development methodologies, language versions, framework, APIs, and so on, that minimize risk by fostering safety and simplicity in C++, including: + +- See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. +- See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. +- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](https://learn.microsoft.com/cpp/standard-library/vector-class) and [`std::string`](https://learn.microsoft.com/cpp/standard-library/string), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](https://learn.microsoft.com/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-170) which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. +- The [SafeInt library](https://learn.microsoft.com/cpp/safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. + +**Consume secure dependencies** + +Binaries shouldn't link to insecure libraries and dependencies. Development teams should track all external dependencies and resolve CVEs/identified security vulnerabilities in these components by updating to more secure versions when subject to those vulnerabilities. + +**Maximize code provenance guarantees and efficiency of security response** + +Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response in the event of compromise. The following compiler switches generate information that is critical to a security response: + +- [`/ZH:SHA_SHA256` in Visual C++](https://learn.microsoft.com/cpp/build/reference/zh) - All PDB source file hashes should be generated by a cryptographically secure algorithm. +- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](https://learn.microsoft.com/cpp/build/reference/z7-zi-zi-debug-information-format) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, builds should produce and archive private PDBs for all released binaries. Full symbols are required by binary analysis tools to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, lowering debugging and investigation costs when engineers are racing to assess, limit and correct damage to organizations when code has been exploited by an attacker. +- [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](https://learn.microsoft.com/cpp/build/reference/sourcelink?view=msvc-170): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of pre-release security validations and post-release incident response. + +**Enable compiler errors to prevent issues at code authoring time** + +Compilation should enable security-relevant compiler checks as breaking errors, for example: +- [`/sdl` in Visual C++ - Enable additional security checks](https://aka.ms/AdditionalSecurityChecks) elevates many security-relevant warnings into errors and sets additional secure code-generation features. +- [BinSkim BA2007.EnableCriticalCompilerWarnings | GitHub](https://github.com/microsoft/binskim/blob/main/src/BinSkim.Rules/PERules/BA2007.EnableCriticalCompilerWarnings.cs) maintains a list of Microsoft-recommended C/C++ compiler warnings that should always be enabled and elevated to errors. + +**Mark binaries as compatible with OS runtime security mitigations** + +Compiler settings should opt into code generation features that detect and mitigate malicious code execution, including: +- Stack corruption prevention + - [`/SAFESEH` - Image has safe exception handlers](https://aka.ms/SafeExceptionHandlers) - Produces a table of the image's safe exception handlers for x86 binaries. + - [`/GS` - Buffer Security Check](https://aka.ms/BufferSecurityCheck) - Detects some buffer overruns that overwrite return addresses, exception handler addresses or certain types of parameters. +- Position independent code execution + - [`/DYNAMICBASE` - Use Address Space Layout Randomization](https://aka.ms/ASLR) - Generates executable images that can be randomly rebased at load time. + - [`/HIGHENTROPVA` and `/LARGEADDRESSAWARE` - Support 64-bit ASLR, and Handle large addresses](https://aka.ms/HEVA) - Enables use of entire 64-bit address space for image rebasing. +- Code flow integrity + - [`/guard:cf` - Enable Control Flow Guard](https://aka.ms/ControlFlowGuard) - Inserts runtime verifications for indirect call targets. + - [`/CETCOMPAT` - CET shadow stack compatible](https://aka.ms/CETShadowStack) - Marks an executable image as compatible with Microsoft's implementation of Intel's [Control-flow Enforcement Technology (CET)](https://www.intel.com/content/www/us/en/developer/articles/technical/technical-look-control-flow-enforcement-technology.html) Shadow Stack feature. + - [`/guard:ehcont` - Enable EH continuation metadata](https://learn.microsoft.com/cpp/build/reference/guard-enable-eh-continuation-metadata?view=msvc-170) - Generates a list of safe relative virtual addresses (RVA) of all exception handling continuation targets. +- Data execution prevention + - [`/NXCOMPAT` - Compatible with Data Execution Prevention](https://aka.ms/DataExecutionPrevention) - Marks a 32-bit executable image as compatible with the [Windows Data Execution Prevention](https://support.microsoft.com/topic/what-is-data-execution-prevention-dep-60dabc2b-90db-45fc-9b18-512419135817) feature. (A 64-bit build has this by default.) + +**Prevent sensitive information disclosure** + +Compiler settings should opt into sensitive information discovery prevention. In recent years, researchers have uncovered unintended information leakage that originates with hardware features such as speculative execution. + +At the software level, confidential data may be transmitted to attackers if unexpectedly leaked. Failure to zero-initialize buffers and other buffer misuse may leak private confidential data to attackers that call trusted API. This class of problem best handled by enabling additional static analysis and the use of secure resource containers as described previously. + +- [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that helps prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](https://learn.microsoft.com/cpp/cpp/spectre) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. + +## 2.6 Black box test cases + +**Summary** + +Black box tests are tests that validate the components without knowledge or need of the inner workings, they are meant to test the end-to-end functionality of the features in the product at virtually at any layer or level. These include all functional tests, UI tests, performance tests, and integration tests. These are valuable for covering general reliability and functional correctness, and ensuring the product behaves as expected. + +**Relation to other sections** + +These types of requirement-based tests are useful for validating the assumptions made in the Threat Model as well as covering potential threats as brought up in that section. These tests are useful for testing the integration between separate components of the product, especially ones that are across trust boundaries as described in the threat model. Black box test cases are also useful for testing all kinds of edge cases for user input validation. Both known edge case and error case testing is useful, as well as Fuzzing for less obvious cases. + +**Automation and regression** + +Run these tests on a regular basis and compare the results to previous runs to catch breaking changes or performance regressions. Also, running these tests on many different machines and installation setups can help cover any issues that may arise from different architectures or setup changes. + +**Crash dumps** + +These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import those into Visual Studio to further investigate what areas are hitting these issues. Along with that, functional tests can be run from within the Visual Studio IDE, making replicating failures and debugging them to see exactly where within the black box of the product the test fails easily, as well as testing code changes and fixes quickly. + +To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/debug-unit-tests-with-test-explorer?view=vs-2022) + +**In Azure** + +Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, as well as run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: +- [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/overview?view=azure-devops) +- [Run automated tests from test plans - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/run-automated-tests-from-test-hub?view=azure-devops) + +## 2.7 Code-based test cases + +**Summary** + +Code-based test cases are an integral part of maintaining the security and reliability of your product. These tests should be small and fast and should not have an impact on each other so they can be run in parallel. This makes it easy for developers to run these tests locally on their machine any time they make changes to the code without worrying about slowing down their development cycle. + +**Types, and relation to other sections** + +Common types of code-based test cases include unit tests, parameterized tests to cover functions with multiple input types, component testing to keep each test component separate, and mock testing to validate parts of the code that communicate with other services, without expanding the scope of the test to include those services themselves. As opposed to black box style tests, these tests are based on the code that is written instead of the functional requirements of the product. + +**Goal** + +Through these tests, the goal is to achieve a high level of test coverage over your code. By actively tracking this coverage and its gaps, adding more tests that exercise all code paths will increase the confidence that your code is secure and reliable when any changes are made. + +**Visual Studio** + +The test explorer tools in Visual Studio make it easy to run these tests frequently and get feedback on pass/fail rates and failure locations quickly. On top of this, many of the test frameworks support CodeLens features to see the test status at the location of the test itself, making adding and maintaining the suite of tests much easier. The Test Explorer also makes managing these tests easy, allowing for test groups, custom test playlists, filtering, sorting, searching, and more. + +For more information, see: + +- [Unit testing fundamentals - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/unit-test-basics?view=vs-2022) - an introduction and overview +- [Run unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2022) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer + +Visual Studio also comes with tools for tracking the code coverage that allow developers to ensure that code changes they make are covered by existing tests, or adding new tests to cover new and untested code paths. It also shows the code coverage percentage to ensure it is maintained above a target level for confidence in overall code quality. + +For information about these tools, see [Code coverage testing - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested?view=vs-2022&tabs=csharp) + +**In Azure** + +Azure DevOps can also help in tracking code coverage results for the whole product as part of the build pipeline process. For more information, see [Review code coverage - Azure Pipelines](https://learn.microsoft.com/azure/devops/pipelines/test/review-code-coverage-results?view=azure-devops). + +## 2.8 Historical test cases + +**Summary** + +Historical test cases are extremely helpful to prevent issues from showing up more than once, as well as increasing the overall test coverage of the product. By ensuring that bug fixes are accompanied by corresponding tests, over time as fixes are made the overall robustness of the testing suite will keep improving, giving better assurances of reliability and security. + +**Key qualities, and relation to other sections** + +Since they test for bug regressions, these tests should be quick and easy to run, so they can run alongside the [Code Based Test Cases] and contribute to the overall code coverage of the product. Along with this, using real examples from customers to inspire new test cases is a great way to improve coverage and quality of tests. + +**Visual Studio** + + Using Visual Studio, it's easy to add tests to the suite when making the changes to fix the bug, and then quickly run the tests and code coverage to ensure all new cases are considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. For even more robust tracking, using Azure DevOps boards, test plans, and Visual Studio to associate tests, test cases, and issues can keep track of all aspects of an issue and its corresponding tests. For more information, see: +- [Associate automated tests with test cases - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/associate-automated-test-with-test-case?view=azure-devops) +- [Link work items to other objects - Azure DevOps](https://learn.microsoft.com/azure/devops/organizations/notifications/add-links-to-work-items?toc=%2Fazure%2Fdevops%2Fboards%2Ftoc.json&view=azure-devops) + +Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. Leveraging the Test Explorer's test grouping is a good way to keep track of tests that belong together as well. For more information, see: +- [Run unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2022#group-and-filter-the-test-list) + +## 2.9 Fuzzing + +**Summary** +Fuzzing (also known as fuzz testing) is an automated software testing technique that involves providing invalid, unexpected, or random data as input to a program. The program is then monitored for exceptions such as crashes, failing built-in or compiler injected code assertions and potential memory leaks. + +**Guidance** + +Use fuzzing on all software that may process untrusted inputs that an attacker could control. If you are building a new application and its associated test suite, include fuzzing for key modules as early as possible. Running fuzzing for the first time on a piece of software nearly always uncovers actual vulnerabilities that were previously unknown. Once you start fuzzing, never stop. + +**Relation to other sections** + +When fuzzing reports a failure, it always naturally provides a reproducible test case that demonstrates the bug. This test case can be reproduced, resolved, and then added to the Historical Test Cases. + +When using both sanitizers (for example, [Address Sanitizer (ASAN)](https://learn.microsoft.com/cpp/sanitizers/asan?view=msvc-170)) and fuzzing: +- First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](https://learn.microsoft.com/cpp/sanitizers/asan?view=msvc-170#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html) which is enabled by ASAN. +- For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). + +**Key qualities** + +- Fuzzing finds vulnerabilities often missed by static program analysis, exhaustive feature testing and manual code inspection. +- Fuzzing is an effective way to find security and reliability bugs in software, so much so that the [Microsoft Security Development Lifecycle](https://www.microsoft.com/securityengineering/sdl/) requires fuzzing at every untrusted interface of every product (see also Threat Modeling). +- Always use fuzzing for software that may process untrusted inputs. +- Fuzzing is particularly effective for standalone applications with large data parsers. + +**Azure and GitHub CI/CD** + +Modify your build(s) to support continuous creation of executables that use LibFuzzer or AFL++. You can add extra computing resources required for fuzzing at services like OSS-Fuzz or OneFuzz. + +## 2.10 Web Application Scanning + +**Summary** + +Within the scope of Microsoft Visual C++ on Windows, Microsoft recommends: + +- Prefer TypeScript, JavaScript, and ASP.NET for web applications. +- Don't write web extensions in C++. Microsoft has banned using ActiveX. +- When code is compiled to Emscripten/WASM, it is no longer C++ and other tools apply. +- Microsoft provides [RESTler, a stateful REST API fuzzer](https://github.com/microsoft/restler-fuzzer). + +**Overview and key qualities** + +A web application scanner explores a web application by crawling through its web pages and examines it for security vulnerabilities. This crawl involves the automatic generation of malicious inputs and evaluation of the application's responses. Critically, web application scanning must cover/support the following: + +- Catalogs all web apps in your network, including new and unknown ones, and scales from a handful of apps to thousands. +- Deep scanning for software versions, SOAP and REST API services and API's used by mobile devices. +- Insertion of security primitives into application development and deployment in DevOps environments. These work with the crawler. +- Malware detection. + +## 2.11 Check Included Software Components + +**Summary** + +C++ code should be handled the same as other programming languages, and checks should be supported by any Software Composition Analysis (SCA) and Origin Analysis (OA) tooling adopted by your company. Workflows and security scanning should be designed as part of CI/CD (continuous integration and continuous delivery) systems. + +**Upstream defense** + +To mitigate the risk of attacks on upstream dependencies, third party sources/components should be stored on an enterprise-controlled asset, against which SCA and OA tools are run. +- Tools should scan and alert when vulnerabilities are identified (including public databases) such as: [Home | CVE](https://www.cve.org/) +- Run static analysis on all software components included in your application/repo to identify vulnerable code patterns. + +**Dependency defense** + +Perform and maintain an audit of dependencies to validate that all such occurrences are accounted for and covered by your SCA and OA tools. +- Components should be regularly audited and updated to the latest verified versions. +- Package feed dependencies. +- All package dependencies come from a single feed that are covered/audited by SCA/OA tools. + +**SBOM** + +Produce an SBOM (software bill of materials) with your product listing all dependencies such as: +- origin (for example, URL (Uniform Resource Locator)) +- version +- consistency (for example, SHA-256 source hash), and other means for validating consistency such as deterministic builds. +- Require and audit SBOM files in software dependencies or produced as part of a build including OSS (open-source software). +- Microsoft is standardizing on and recommends [SPDX (Software Package Data Exchange) version 2.2 or later | Linux Foundation](https://spdx.dev/specifications/) as the SBOM document format. +- Build determinism can be used to independently produce bit-wise identical binaries and provide independent verifications of integrity: + - 1st party or 3rd party attestation of reproducibility + - Other techniques such as binary signing via a trusted certificate source can also provide some assurances of binary integrity. + +**Additional resources** + +Microsoft solutions include the following guidance and products: +- [Microsoft Supply Chain Platform | Microsoft](https://www.microsoft.com/microsoft-cloud/solutions/microsoft-supply-chain-platform) +- [Secure your software supply chain | GitHub Security](https://github.com/features/security/software-supply-chain) +- [vcpkg | vcpkg.io](https://vcpkg.io/en/) - vcpkg private registries allow re-direction of OSS acquisition to Enterprise-controlled resources for acquiring sources for a dependency, to minimize risk of upstream or over-the-wire attacks. \ No newline at end of file diff --git a/docs/code-quality/toc.yml b/docs/code-quality/toc.yml index f5c6b463a9..1f6bfaca52 100644 --- a/docs/code-quality/toc.yml +++ b/docs/code-quality/toc.yml @@ -6,6 +6,8 @@ items: href: ../code-quality/code-analysis-for-c-cpp-overview.md - name: Quickstart href: ../code-quality/quick-start-code-analysis-for-c-cpp.md +- name: Build reliable and secure programs + href: ../code-quality/build-reliable-secure-programs.md - name: Analyze C/C++ code for defects href: ../code-quality/walkthrough-analyzing-c-cpp-code-for-defects.md - name: Sample project diff --git a/docs/index.yml b/docs/index.yml index 880338489d..073c1d9b10 100644 --- a/docs/index.yml +++ b/docs/index.yml @@ -176,6 +176,8 @@ additionalContent: # Card - title: Features links: + - text: Build reliable and secure programs + url: code-quality/build-reliable-secure-programs.md - text: Edit and refactor code url: ide/writing-and-refactoring-code-cpp.md - text: Build code projects From a16ad061a355e981d1db8c95d6fe76bf1467fa54 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 7 Sep 2023 15:59:01 -0700 Subject: [PATCH 0095/1931] fix links --- .../build-reliable-secure-programs.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 5d6e5a0d91..b96d1f0a65 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -25,7 +25,7 @@ Threat modeling is best used as one part of a dynamic Security Development Lifec 1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. 1. Apply threat modeling early (as with all security requirements), when there is still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security (see below). Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. 1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This enables better automated risk assessment and focusing of security efforts on the specific components or features that change. -1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](https://learn.microsoft.com/azure/security/develop/threat-modeling-tool). +1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) **Supporting factors and practices** @@ -78,7 +78,7 @@ There are several types of automated tests, and while not all are applicable to **Visual Studio** -Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks and options to install extensions for more frameworks. This is helpful for running a subset of tests covering the code you're working on, as well as making it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, as well as providing helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp.md) +Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks and options to install extensions for more frameworks. This is helpful for running a subset of tests covering the code you're working on, as well as making it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, as well as providing helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp). **In Azure and GitHub CI/CD** @@ -100,7 +100,7 @@ Tests that do deeper verification and take longer to run, such as static analysi **Key tools** Be aware of and use the following: -- [Code analysis documentation - C++ and .NET](visualstudio/code-quality.md) +- [Code analysis documentation - C++ and .NET](visualstudio/code-quality/) - [`/analyze` - Visual C++ compiler](../build/reference/analyze-code-analysis.md) - [`/W4` and `/WX` - Visual C++ compiler](../build/reference/compiler-option-warning-level.md) - [Use the C++ Core Guidelines Checkers](using-the-cpp-core-guidelines-checkers.md) @@ -177,7 +177,7 @@ AzDO users can scan their code through Microsoft Defender for DevOps for known t - [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) - [GitHub advanced security for Azure DevOps (GHAS for AzDO) | GitHub](https://partner.github.com/2022/10/12/azure-devops-article.html) -- [Detect exposed secrets in code](https://learn.microsoft.com/azure/defender-for-cloud/detect-exposed-secrets) +- [Detect exposed secrets in code](/azure/defender-for-cloud/detect-exposed-secrets) **In GitHub** @@ -225,7 +225,7 @@ Code should utilize development methodologies, language versions, framework, API - See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. - See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. - [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](https://learn.microsoft.com/cpp/standard-library/vector-class) and [`std::string`](https://learn.microsoft.com/cpp/standard-library/string), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](https://learn.microsoft.com/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-170) which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. -- The [SafeInt library](https://learn.microsoft.com/cpp/safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. +- The [SafeInt library](/cpp/safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. **Consume secure dependencies** @@ -235,9 +235,9 @@ Binaries shouldn't link to insecure libraries and dependencies. Development team Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response in the event of compromise. The following compiler switches generate information that is critical to a security response: -- [`/ZH:SHA_SHA256` in Visual C++](https://learn.microsoft.com/cpp/build/reference/zh) - All PDB source file hashes should be generated by a cryptographically secure algorithm. -- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](https://learn.microsoft.com/cpp/build/reference/z7-zi-zi-debug-information-format) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, builds should produce and archive private PDBs for all released binaries. Full symbols are required by binary analysis tools to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, lowering debugging and investigation costs when engineers are racing to assess, limit and correct damage to organizations when code has been exploited by an attacker. -- [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](https://learn.microsoft.com/cpp/build/reference/sourcelink?view=msvc-170): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of pre-release security validations and post-release incident response. +- [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - All PDB source file hashes should be generated by a cryptographically secure algorithm. +- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, builds should produce and archive private PDBs for all released binaries. Full symbols are required by binary analysis tools to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, lowering debugging and investigation costs when engineers are racing to assess, limit and correct damage to organizations when code has been exploited by an attacker. +- [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](../build/reference/sourcelink.md): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of pre-release security validations and post-release incident response. **Enable compiler errors to prevent issues at code authoring time** @@ -257,7 +257,7 @@ Compiler settings should opt into code generation features that detect and mitig - Code flow integrity - [`/guard:cf` - Enable Control Flow Guard](https://aka.ms/ControlFlowGuard) - Inserts runtime verifications for indirect call targets. - [`/CETCOMPAT` - CET shadow stack compatible](https://aka.ms/CETShadowStack) - Marks an executable image as compatible with Microsoft's implementation of Intel's [Control-flow Enforcement Technology (CET)](https://www.intel.com/content/www/us/en/developer/articles/technical/technical-look-control-flow-enforcement-technology.html) Shadow Stack feature. - - [`/guard:ehcont` - Enable EH continuation metadata](https://learn.microsoft.com/cpp/build/reference/guard-enable-eh-continuation-metadata?view=msvc-170) - Generates a list of safe relative virtual addresses (RVA) of all exception handling continuation targets. + - [`/guard:ehcont` - Enable EH continuation metadata](../build/reference/guard-enable-eh-continuation-metadata.md) - Generates a list of safe relative virtual addresses (RVA) of all exception handling continuation targets. - Data execution prevention - [`/NXCOMPAT` - Compatible with Data Execution Prevention](https://aka.ms/DataExecutionPrevention) - Marks a 32-bit executable image as compatible with the [Windows Data Execution Prevention](https://support.microsoft.com/topic/what-is-data-execution-prevention-dep-60dabc2b-90db-45fc-9b18-512419135817) feature. (A 64-bit build has this by default.) @@ -267,7 +267,7 @@ Compiler settings should opt into sensitive information discovery prevention. In At the software level, confidential data may be transmitted to attackers if unexpectedly leaked. Failure to zero-initialize buffers and other buffer misuse may leak private confidential data to attackers that call trusted API. This class of problem best handled by enabling additional static analysis and the use of secure resource containers as described previously. -- [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that helps prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](https://learn.microsoft.com/cpp/cpp/spectre) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. +- [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that helps prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](../cpp/spectre.md) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. ## 2.6 Black box test cases @@ -287,12 +287,12 @@ Run these tests on a regular basis and compare the results to previous runs to c These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import those into Visual Studio to further investigate what areas are hitting these issues. Along with that, functional tests can be run from within the Visual Studio IDE, making replicating failures and debugging them to see exactly where within the black box of the product the test fails easily, as well as testing code changes and fixes quickly. -To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/debug-unit-tests-with-test-explorer?view=vs-2022) +To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/debug-unit-tests-with-test-explorer) **In Azure** Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, as well as run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: -- [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/overview?view=azure-devops) +- [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](/azure/devops/test/overview) - [Run automated tests from test plans - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/run-automated-tests-from-test-hub?view=azure-devops) ## 2.7 Code-based test cases @@ -315,16 +315,16 @@ The test explorer tools in Visual Studio make it easy to run these tests frequen For more information, see: -- [Unit testing fundamentals - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/unit-test-basics?view=vs-2022) - an introduction and overview -- [Run unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2022) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer +- [Unit testing fundamentals - Visual Studio (Windows)](/visualstudio/test/unit-test-basics) - an introduction and overview +- [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer Visual Studio also comes with tools for tracking the code coverage that allow developers to ensure that code changes they make are covered by existing tests, or adding new tests to cover new and untested code paths. It also shows the code coverage percentage to ensure it is maintained above a target level for confidence in overall code quality. -For information about these tools, see [Code coverage testing - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested?view=vs-2022&tabs=csharp) +For information about these tools, see [Code coverage testing - Visual Studio (Windows)](/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested) **In Azure** -Azure DevOps can also help in tracking code coverage results for the whole product as part of the build pipeline process. For more information, see [Review code coverage - Azure Pipelines](https://learn.microsoft.com/azure/devops/pipelines/test/review-code-coverage-results?view=azure-devops). +Azure DevOps can also help in tracking code coverage results for the whole product as part of the build pipeline process. For more information, see [Review code coverage - Azure Pipelines](/azure/devops/pipelines/test/review-code-coverage-results). ## 2.8 Historical test cases @@ -343,7 +343,7 @@ Since they test for bug regressions, these tests should be quick and easy to run - [Link work items to other objects - Azure DevOps](https://learn.microsoft.com/azure/devops/organizations/notifications/add-links-to-work-items?toc=%2Fazure%2Fdevops%2Fboards%2Ftoc.json&view=azure-devops) Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. Leveraging the Test Explorer's test grouping is a good way to keep track of tests that belong together as well. For more information, see: -- [Run unit tests with Test Explorer - Visual Studio (Windows)](https://learn.microsoft.com/visualstudio/test/run-unit-tests-with-test-explorer?view=vs-2022#group-and-filter-the-test-list) +- [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) ## 2.9 Fuzzing From 91bd68706aa2e02f398133973878aa50d125d638 Mon Sep 17 00:00:00 2001 From: Tsuyoshi Miyake Date: Fri, 8 Sep 2023 10:00:55 -0700 Subject: [PATCH 0096/1931] Update project-property-inheritance.md (#4700) This doesn't work without '\' --- docs/build/project-property-inheritance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/build/project-property-inheritance.md b/docs/build/project-property-inheritance.md index cccf6e6fbe..3456a29290 100644 --- a/docs/build/project-property-inheritance.md +++ b/docs/build/project-property-inheritance.md @@ -24,7 +24,7 @@ Project properties are stored in several files. Some are stored directly in the ::: moniker range=">=msvc-160" -Project properties are stored in several files. Some are stored directly in the *`.vcxproj`* project file. Others come from other *`.targets`* or *`.props`* files that the project file imports and which supply default values. You'll find the Visual Studio project files in a locale-specific folder under the base directory, *`%VSINSTALLDIR%MSBuild\Microsoft\VC\`*. The `` is specific to the version of Visual Studio. It's *`v160`* for Visual Studio 2019. +Project properties are stored in several files. Some are stored directly in the *`.vcxproj`* project file. Others come from other *`.targets`* or *`.props`* files that the project file imports and which supply default values. You'll find the Visual Studio project files in a locale-specific folder under the base directory, *`%VSINSTALLDIR%\MSBuild\Microsoft\VC\`*. The `` is specific to the version of Visual Studio. It's *`v160`* for Visual Studio 2019. ::: moniker-end From 22276084dec1cfbf7ce554026dd0db1ab8a09b51 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 8 Sep 2023 10:26:43 -0700 Subject: [PATCH 0097/1931] fixing links --- .../build-reliable-secure-programs.md | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index b96d1f0a65..32bfc7dbb2 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -23,7 +23,7 @@ Threat modeling is best used as one part of a dynamic Security Development Lifec 1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. 1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. -1. Apply threat modeling early (as with all security requirements), when there is still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security (see below). Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. +1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security (see below). Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. 1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This enables better automated risk assessment and focusing of security efforts on the specific components or features that change. 1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) @@ -42,7 +42,7 @@ Having a security questionnaire affixed to a security requirements phase that ti *Product inventory* -Second, maintain a strong asset inventory of the products you are tasked with assessing. Products are growing in complexity. We now have devices in Operational Technology (OT) spaces that have connectivity with sensors (such as passenger rail and vehicles), bus-based networks that talk to other IoT / OT components in the vehicle (such as CANBUS or PROFIBUS), wireless/cellular/Bluetooth for communication with customer devices and cloud back ends, machine learning in the cloud feeding back into the device or a fleet management application, and so on. In such a complex product, it's generally not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. +Second, maintain a strong asset inventory of the products you're tasked with assessing. Products are growing in complexity. We now have devices in Operational Technology (OT) spaces that have connectivity with sensors (such as passenger rail and vehicles), bus-based networks that talk to other IoT / OT components in the vehicle (such as CANBUS or PROFIBUS), wireless/cellular/Bluetooth for communication with customer devices and cloud back ends, machine learning in the cloud feeding back into the device or a fleet management application, and so on. In such a complex product, it's not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. *Granularity and integration* @@ -50,17 +50,17 @@ Establish compliance systems that let you establish and measure compliance metri *Scale* -Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. This lets you evaluate them for patterns, and make intelligent decisions on how to refine the product security program on a regular basis. Ideally, you can combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), and this can be translated into what security teams should focus on to maximize return on threat modeling investment. +Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. This lets you evaluate them for patterns, and make intelligent decisions on how to refine the product security program regularly. Ideally, you can combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), and this can be translated into what security teams should focus on to maximize return on threat modeling investment. ## 2.2 Automated testing **Summary** -Automated tests are an important way to ensure the quality and safety of your code. They are an integral piece in supporting other areas mentioned in this document, such as Threat Modeling. When paired with other secure coding practices, they help to protect against bugs and vulnerabilities being introduced into the codebase. +Automated tests are an important way to ensure the quality and safety of your code. They're an integral piece in supporting other areas mentioned in this document, such as Threat Modeling. When paired with other secure coding practices, they help to protect against bugs and vulnerabilities being introduced into the codebase. **Key attributes** -Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should be accompanied by corresponding tests to ensure the long-term security and reliability of the code when possible. The best way to ensure automated tests are run and cover all areas is to have them running in as many environments as possible: +Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should have corresponding tests to ensure the long-term security and reliability of the code when possible. The best way to ensure automated tests are run and cover all areas is to have them running in as many environments as possible: - The first place they should run is on the machine that is making the changes. This is most easily done within the IDE that is being used for editing, or as a script on the command line as the developer makes the changes. - The next place they should run is as part of the pull request commit/merge process. @@ -70,11 +70,11 @@ The scope of the tests should increase at each step, with the last step providin **Continuous use and maintenance** -Test reliability is an important part of maintaining the effectiveness of the testing suite. Test failures should be assigned and investigated, with potential security issues getting high priority and getting updated within a prompt and predetermined timeframe. Ignoring test failures should not be a common practice, but should require strong justification and approval. Test failures due to issues within the test suite itself should be treated the same as other failures, as this presents a lapse in coverage and can cause product issues to be missed. +Test reliability is an important part of maintaining the effectiveness of the testing suite. Test failures should be assigned and investigated, with potential security issues getting high priority and getting updated within a prompt and predetermined timeframe. Ignoring test failures shouldn't be a common practice, but should require strong justification and approval. Test failures due to issues within the test suite itself should be treated the same as other failures, as this presents a lapse in coverage and can cause product issues to be missed. **Kinds of tests, especially unit tests** -There are several types of automated tests, and while not all are applicable to all applications, a good test suite will contain a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of these can be run quickly and often. As part of the wider test infrastructure running remotely, these tests can also easily be run on multiple machine hardware setups, which can catch issues that cannot always be reproduced on a single developer's machine. +There are several types of automated tests, and while not all are applicable to all applications, a good test suite will contain a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of these can be run quickly and often. As part of the wider test infrastructure running remotely, these tests can also easily be run on multiple machine hardware setups, which can catch issues that can't always be reproduced on a single developer's machine. **Visual Studio** @@ -89,7 +89,7 @@ Tests that do deeper verification and take longer to run, such as static analysi ## 2.3 Code-based, or static, analysis -**Summary** Static code/binary analysis should be enabled by default, to be secure by default. Static analysis is a compiler technology that analyzes a program (either in source code form or in compiled executable form) for required safety and security policies when it is being built, not at execution time when an exploit can occur on the customer's machine. +**Summary** Static code/binary analysis should be enabled by default, to be secure by default. Static analysis is a compiler technology that analyzes a program (either in source code form or in compiled executable form) for required safety and security policies when it's being built, not at execution time when an exploit can occur on the customer's machine. **Recommendations** Microsoft recommends that you: @@ -100,7 +100,7 @@ Tests that do deeper verification and take longer to run, such as static analysi **Key tools** Be aware of and use the following: -- [Code analysis documentation - C++ and .NET](visualstudio/code-quality/) +- [Code analysis documentation - C++ and .NET](/visualstudio/code-quality/) - [`/analyze` - Visual C++ compiler](../build/reference/analyze-code-analysis.md) - [`/W4` and `/WX` - Visual C++ compiler](../build/reference/compiler-option-warning-level.md) - [Use the C++ Core Guidelines Checkers](using-the-cpp-core-guidelines-checkers.md) @@ -111,7 +111,7 @@ Tests that do deeper verification and take longer to run, such as static analysi Notes: - `/analyze` enables static analysis of C++ code at compile time to identify critical security and reliability code vulnerabilities. It should be enabled throughout a C++ program's entire development timeline. Start by enabling at least the "Microsoft Native Recommended" by default as a minimum baseline, then consult the documentation for how to specify additional rules beyond those, notably the C++ Core Guidelines rules, as required by your engineering policies. The source code Static Analysis capability is available in both the Visual C++ IDE and in the command-line Build Tools. -- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). Note that these include warnings from the compiler back-end that can and do find uninitialized uses that other static analysis tools cannot, because the compiler does perform interprocedural analysis and inlining when the checking runs. +- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). Note that these include warnings from the compiler back-end that can and do find uninitialized uses that other static analysis tools can't, because the compiler does perform interprocedural analysis and inlining when the checking runs. - BinSkim binary analysis ensures that projects enable a broad range of security features and generate outputs (such as PDBs) that maximize chain-of-custody verification and efficiency of security response. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. Consult the BinSkim User Guide linked above for how to install and run the binary analyzer, and the full list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Microsoft recommends caution and selectively fixing issues reported as "warnings," as resolving these problems may have performance implications or simply may not be required for all scenarios. **In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Running source code analysis in context of the local developer machine will prevent introduction of issues early and lower overall costs. The rate-of-introduction of binary-level issues tends to be slower than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. @@ -120,11 +120,11 @@ Notes: **Summary** -Don't hardcode secrets within software. To find and remove secrets from the source code, it is most efficient to use a reliable tool that can scan the entire source code and find them. Once found, move them to a safe place following the guideline for secure storage and use of secrets. +Don't hardcode secrets within software. To find and remove secrets from the source code, it's most efficient to use a reliable tool that can scan the entire source code and find them. Once found, move them to a safe place following the guideline for secure storage and use of secrets. **Problem** -Secrets for software refer to entities that establish identity and provide access to resources or are used to protect important or sensitive data by signing or encrypting the data (for example, passwords, storage keys, connection strings, private keys). It is tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets (either in plain text or encrypted but with easily discoverable decryption key) can lead to severe or catastrophic security incidents as they are easily discovered and can be used to compromise your service and data. +Secrets for software refer to entities that establish identity and provide access to resources or are used to protect important or sensitive data by signing or encrypting the data (for example, passwords, storage keys, connection strings, private keys). It's tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets (either in plain text or encrypted but with easily discoverable decryption key) can lead to severe or catastrophic security incidents as they're easily discovered and can be used to compromise your service and data. **Prevention** @@ -136,7 +136,7 @@ Secrets hardcoded in source code (as plain text or encrypted blob) are a securit - Don't encrypt a secret with an easily discoverable decryption key. For example, don't store a PFX file along with a file that contains its password. - Don't encrypt a secret with a weak decryption. For example, don't encrypt a PFX file with a weak or common password. - Avoid putting encrypted credentials in source code. Instead, use placeholders in your source that will be replaced with secrets from approved stores using the capabilities provided by your chosen deployment system. See below for more details. -- Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target non-production systems as they are less well managed, then use them to pivot into production. +- Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target non-production systems as they're less well managed, then use them to pivot into production. - Don't share secrets between deployments (for example, testing, staging, production). While not directly related to hardcoded secrets, also remember securing secrets for your test, development, and production: @@ -153,7 +153,7 @@ Legacy components of your product may contain hidden hardcoded secrets in their **Remediation** -When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. If there is a running system that needs to stay up, if a secret manager needs to be put into play, remediation should follow these steps: +When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. If there's a running system that needs to stay up, if a secret manager needs to be put into play, remediation should follow these steps: 1. If remediation allows switch-over to managed identities or requires dropping in a secret manager such as Azure Key Vault (AKV), complete that work, and redeploy with updated identity/key. 1. Invalidate the exposed secret. @@ -210,7 +210,7 @@ Binary hardening is done by applying compile-time security controls. These inclu Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains a public OSS binary checker, BinSkim, that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) -Binary-level controls differ according to where they are applied in the engineering process. It is useful to distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. +Binary-level controls differ according to where they're applied in the engineering process. It's useful to distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. Developer settings will tend towards enabling maximal static analysis, the production of private data to accelerate debugging, and so on. Release builds will be tuned to an appropriate combination of security, performance, and other code generation concerns. Release processes must be configured to properly generate and manage public vs. privately consumed build data (for example, public vs. private symbols). @@ -224,7 +224,7 @@ Code should utilize development methodologies, language versions, framework, API - See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. - See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. -- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](https://learn.microsoft.com/cpp/standard-library/vector-class) and [`std::string`](https://learn.microsoft.com/cpp/standard-library/string), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](https://learn.microsoft.com/cpp/c-runtime-library/security-features-in-the-crt?view=msvc-170) which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. +- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../cpp/standard-library/vector-class.md) and [`std::string`](../cpp/standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../cpp/c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. - The [SafeInt library](/cpp/safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. **Consume secure dependencies** @@ -273,7 +273,7 @@ At the software level, confidential data may be transmitted to attackers if unex **Summary** -Black box tests are tests that validate the components without knowledge or need of the inner workings, they are meant to test the end-to-end functionality of the features in the product at virtually at any layer or level. These include all functional tests, UI tests, performance tests, and integration tests. These are valuable for covering general reliability and functional correctness, and ensuring the product behaves as expected. +Black box tests are tests that validate the components without knowledge or need of the inner workings, they're meant to test the end-to-end functionality of the features in the product at virtually at any layer or level. These include all functional tests, UI tests, performance tests, and integration tests. These are valuable for covering general reliability and functional correctness, and ensuring the product behaves as expected. **Relation to other sections** @@ -299,7 +299,7 @@ Azure DevOps can also help manage and validate these tests with the use of Test **Summary** -Code-based test cases are an integral part of maintaining the security and reliability of your product. These tests should be small and fast and should not have an impact on each other so they can be run in parallel. This makes it easy for developers to run these tests locally on their machine any time they make changes to the code without worrying about slowing down their development cycle. +Code-based test cases are an integral part of maintaining the security and reliability of your product. These tests should be small and fast and shouldn't have an impact on each other so they can be run in parallel. This makes it easy for developers to run these tests locally on their machine any time they make changes to the code without worrying about slowing down their development cycle. **Types, and relation to other sections** @@ -316,9 +316,9 @@ The test explorer tools in Visual Studio make it easy to run these tests frequen For more information, see: - [Unit testing fundamentals - Visual Studio (Windows)](/visualstudio/test/unit-test-basics) - an introduction and overview -- [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer +- [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer -Visual Studio also comes with tools for tracking the code coverage that allow developers to ensure that code changes they make are covered by existing tests, or adding new tests to cover new and untested code paths. It also shows the code coverage percentage to ensure it is maintained above a target level for confidence in overall code quality. +Visual Studio also comes with tools for tracking the code coverage that allow developers to ensure that code changes they make are covered by existing tests, or adding new tests to cover new and untested code paths. It also shows the code coverage percentage to ensure it's maintained above a target level for confidence in overall code quality. For information about these tools, see [Code coverage testing - Visual Studio (Windows)](/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested) @@ -339,11 +339,10 @@ Since they test for bug regressions, these tests should be quick and easy to run **Visual Studio** Using Visual Studio, it's easy to add tests to the suite when making the changes to fix the bug, and then quickly run the tests and code coverage to ensure all new cases are considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. For even more robust tracking, using Azure DevOps boards, test plans, and Visual Studio to associate tests, test cases, and issues can keep track of all aspects of an issue and its corresponding tests. For more information, see: -- [Associate automated tests with test cases - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/associate-automated-test-with-test-case?view=azure-devops) -- [Link work items to other objects - Azure DevOps](https://learn.microsoft.com/azure/devops/organizations/notifications/add-links-to-work-items?toc=%2Fazure%2Fdevops%2Fboards%2Ftoc.json&view=azure-devops) +- [Associate automated tests with test cases - Azure Test Plans](/azure/devops/test/associate-automated-test-with-test-case) +- [Link work items to other objects - Azure DevOps](/azure/devops/organizations/notifications/add-links-to-work-items) -Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. Leveraging the Test Explorer's test grouping is a good way to keep track of tests that belong together as well. For more information, see: -- [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) +Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. Leveraging the Test Explorer's test grouping is a good way to keep track of tests that belong together as well. For more information, see [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) ## 2.9 Fuzzing @@ -352,15 +351,15 @@ Fuzzing (also known as fuzz testing) is an automated software testing technique **Guidance** -Use fuzzing on all software that may process untrusted inputs that an attacker could control. If you are building a new application and its associated test suite, include fuzzing for key modules as early as possible. Running fuzzing for the first time on a piece of software nearly always uncovers actual vulnerabilities that were previously unknown. Once you start fuzzing, never stop. +Use fuzzing on all software that may process untrusted inputs that an attacker could control. If you're building a new application and its associated test suite, include fuzzing for key modules as early as possible. Running fuzzing for the first time on a piece of software nearly always uncovers actual vulnerabilities that were previously unknown. Once you start fuzzing, never stop. **Relation to other sections** When fuzzing reports a failure, it always naturally provides a reproducible test case that demonstrates the bug. This test case can be reproduced, resolved, and then added to the Historical Test Cases. -When using both sanitizers (for example, [Address Sanitizer (ASAN)](https://learn.microsoft.com/cpp/sanitizers/asan?view=msvc-170)) and fuzzing: +When using both sanitizers (for example, [Address Sanitizer (ASAN)](../cpp/sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](https://learn.microsoft.com/cpp/sanitizers/asan?view=msvc-170#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html) which is enabled by ASAN. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../cpp/sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html), which is enabled by ASAN. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** @@ -368,7 +367,7 @@ When using both sanitizers (for example, [Address Sanitizer (ASAN)](https://lear - Fuzzing finds vulnerabilities often missed by static program analysis, exhaustive feature testing and manual code inspection. - Fuzzing is an effective way to find security and reliability bugs in software, so much so that the [Microsoft Security Development Lifecycle](https://www.microsoft.com/securityengineering/sdl/) requires fuzzing at every untrusted interface of every product (see also Threat Modeling). - Always use fuzzing for software that may process untrusted inputs. -- Fuzzing is particularly effective for standalone applications with large data parsers. +- Fuzzing is effective for standalone applications with large data parsers. **Azure and GitHub CI/CD** @@ -382,7 +381,7 @@ Within the scope of Microsoft Visual C++ on Windows, Microsoft recommends: - Prefer TypeScript, JavaScript, and ASP.NET for web applications. - Don't write web extensions in C++. Microsoft has banned using ActiveX. -- When code is compiled to Emscripten/WASM, it is no longer C++ and other tools apply. +- When code is compiled to Emscripten/WASM, it's no longer C++ and other tools apply. - Microsoft provides [RESTler, a stateful REST API fuzzer](https://github.com/microsoft/restler-fuzzer). **Overview and key qualities** From 49a3b38545e47cae9258218385d679623d74a6ef Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 8 Sep 2023 10:49:45 -0700 Subject: [PATCH 0098/1931] fix even more links --- docs/code-quality/build-reliable-secure-programs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 32bfc7dbb2..df58e6cad0 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -293,7 +293,7 @@ To get started with debugging tests, see [Debug unit tests with Test Explorer - Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, as well as run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: - [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](/azure/devops/test/overview) -- [Run automated tests from test plans - Azure Test Plans](https://learn.microsoft.com/azure/devops/test/run-automated-tests-from-test-hub?view=azure-devops) +- [Run automated tests from test plans - Azure Test Plans](/azure/devops/test/run-automated-tests-from-test-hub) ## 2.7 Code-based test cases @@ -357,9 +357,9 @@ Use fuzzing on all software that may process untrusted inputs that an attacker c When fuzzing reports a failure, it always naturally provides a reproducible test case that demonstrates the bug. This test case can be reproduced, resolved, and then added to the Historical Test Cases. -When using both sanitizers (for example, [Address Sanitizer (ASAN)](../cpp/sanitizers/asan.md) and fuzzing: +When using both sanitizers such as [Address Sanitizer (ASAN)](../sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../cpp/sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html), which is enabled by ASAN. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html), which is enabled by ASAN. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** From 2edf713dc38b8ee7d525a8a6d9fd857dcd698289 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 8 Sep 2023 11:31:02 -0700 Subject: [PATCH 0099/1931] more links --- docs/code-quality/build-reliable-secure-programs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index df58e6cad0..f7d92b2d27 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -84,7 +84,7 @@ Visual Studio Test Explorer natively supports many of the most popular C++ testi Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. These validations are easily set up through Azure DevOps or GitHub [Actions](https://docs.github.com/en/actions) and can be set to run automatically and block checking in code if any of these validations fails. Having these blockers helps ensure that all code being checked in is secure based on these more rigorous checks being run. This can be done by leveraging Azure Pipelines and Azure DevOps Build Validation, as described here: -- [Git branch policies and settings - Azure Repos](https://learn.microsoft.com/azure/devops/repos/git/branch-policies?view=azure-devops&tabs=browser#build-validation) +- [Git branch policies and settings - Azure Repos](/azure/devops/repos/git/branch-policies#build-validation) - [Defining the mergeability of pull requests | GitHub Docs](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests) ## 2.3 Code-based, or static, analysis @@ -224,8 +224,8 @@ Code should utilize development methodologies, language versions, framework, API - See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. - See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. -- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../cpp/standard-library/vector-class.md) and [`std::string`](../cpp/standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../cpp/c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. -- The [SafeInt library](/cpp/safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. +- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../cpp/standard-library/vector-class.md) and [`std::string`](../standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. +- The [SafeInt library](../safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. **Consume secure dependencies** From 091960e62d11e8f7eba3dcd06a0a39f9cf7ff94e Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 8 Sep 2023 11:37:41 -0700 Subject: [PATCH 0100/1931] links --- docs/code-quality/build-reliable-secure-programs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index f7d92b2d27..a486668b84 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -224,8 +224,8 @@ Code should utilize development methodologies, language versions, framework, API - See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. - See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. -- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../cpp/standard-library/vector-class.md) and [`std::string`](../standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. -- The [SafeInt library](../safeint/safeint-library) protects against integer overflow in mathematical and comparison operations. +- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../standard-library/vector-class.md) and [`std::string`](../standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. +- The [SafeInt library](../safeint/safeint-library.md) protects against integer overflow in mathematical and comparison operations. **Consume secure dependencies** From c0aebc72791bf1418a7bb0dddcb10984780713ea Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 14:14:44 -0700 Subject: [PATCH 0101/1931] Update 2.1 to address Acrolinx warnings --- .../build-reliable-secure-programs.md | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index a486668b84..1650faef80 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -9,7 +9,9 @@ ms.topic: "conceptual" The United States government publication [NISTIR 8397: Guidelines on Minimum Standards for Developer Verification of Software](https://nvlpubs.nist.gov/nistpubs/ir/2021/NIST.IR.8397.pdf) contains excellent guidance on how to build reliable and secure software in any programming language. -This document follows the same structure as NISTIR 8397. Each section summarizes how to use Microsoft developer products for C++ and other languages to meet that section's security needs, and provides guidance to get the most value in each area. +This document follows the same structure as NISTIR 8397. Each section: +- summarizes how to use Microsoft developer products for C++ and other languages to meet that section's security needs, and +- provides guidance to get the most value in each area. ## 2.1 Threat modeling @@ -19,12 +21,12 @@ Threat modeling is valuable, especially when applied in a way that scales to mee **Recommendations** -Threat modeling is best used as one part of a dynamic Security Development Lifecycle (SDL) approach that can meet individual development teams' needs and enhance security while minimizing wasted cycles and blocking. We suggest that for your product as a whole, for a specific feature, or for a major design or implementation change: +Threat modeling should be one part of your dynamic Security Development Lifecycle (SDL). We suggest that for your product as a whole, for a specific feature, or for a major design or implementation change: 1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. 1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. -1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security (see below). Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. -1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This enables better automated risk assessment and focusing of security efforts on the specific components or features that change. +1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. +1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This approach enables better automated risk assessment and focusing of security efforts on the specific components or features that change. 1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) **Supporting factors and practices** @@ -33,24 +35,35 @@ To properly apply threat modeling and avoid underuse/overuse, we have found that *Development approach* -First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change has a threat model. Instead, consider having a security requirements questionnaire that focuses on specific questions to ask about the feature to determine what future aspects of your SDL apply. For example: +First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change has a threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: - Does the feature make a major change in design of how we provide customer isolation in a multi-tenant environment? If so, consider performing a full threat model. - Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. -- Is this primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. +- Is this change primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. -Having a security questionnaire affixed to a security requirements phase that ties to when the development team is making functional requirements for a feature allows us to apply the right SDL techniques to the unit of development and the SDLC timelines that our development partners are using, avoiding unnecessary blocking and wasted cycles. +The security questionnaire results will inform which SDL techniques to tie to which unit of development. It will also inform development partners of the feature's SDL timelines, so they can collaborate at the right times. *Product inventory* -Second, maintain a strong asset inventory of the products you're tasked with assessing. Products are growing in complexity. We now have devices in Operational Technology (OT) spaces that have connectivity with sensors (such as passenger rail and vehicles), bus-based networks that talk to other IoT / OT components in the vehicle (such as CANBUS or PROFIBUS), wireless/cellular/Bluetooth for communication with customer devices and cloud back ends, machine learning in the cloud feeding back into the device or a fleet management application, and so on. In such a complex product, it's not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. +Second, maintain a strong asset inventory of the products you're tasked with assessing. Products are growing in complexity. It's common to write software for connected devices that have: +- sensors (such as passenger rail and vehicles), +- bus-based networks that talk to other components in the vehicle (such as CANBUS or PROFIBUS), +- wireless/cellular/Bluetooth for communication with customer devices and cloud back ends, +- machine learning in the cloud feeding back into the device or a fleet management application, +- and more. + +In such complex products, it's not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. *Granularity and integration* -Establish compliance systems that let you establish and measure compliance metrics for feature level development (generally with higher frequency and smaller granularity, sometimes even on the developer's system or at code commit/merge time), and tie them into asset inventory systems that let you periodically evaluate security for the broader product a feature or component is being consumed by (typically with less frequency and broader granularity, such as at module or system testing time). +Establish systems to measure compliance using clear metrics. +- Regularly measure compliance for feature level development. Feature compliance generally should be measured with higher frequency and smaller granularity, sometimes even on the developer's system or at code commit/merge time. +- Periodically evaluate security for the broader product in which a feature or component is being consumed. Broader evaluations typically will be done with lower frequency and broader granularity, such as at module or system testing time. *Scale* -Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. This lets you evaluate them for patterns, and make intelligent decisions on how to refine the product security program regularly. Ideally, you can combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), and this can be translated into what security teams should focus on to maximize return on threat modeling investment. +Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. Having a clear inventory lets you evaluate review outputs for patterns, and make intelligent decisions on how to refine the product security program regularly. + +Try to combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools. Combining them enables you to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), to inform your security teams what to focus on to get the best value out of the threat modeling. ## 2.2 Automated testing @@ -429,4 +442,4 @@ Produce an SBOM (software bill of materials) with your product listing all depen Microsoft solutions include the following guidance and products: - [Microsoft Supply Chain Platform | Microsoft](https://www.microsoft.com/microsoft-cloud/solutions/microsoft-supply-chain-platform) - [Secure your software supply chain | GitHub Security](https://github.com/features/security/software-supply-chain) -- [vcpkg | vcpkg.io](https://vcpkg.io/en/) - vcpkg private registries allow re-direction of OSS acquisition to Enterprise-controlled resources for acquiring sources for a dependency, to minimize risk of upstream or over-the-wire attacks. \ No newline at end of file +- [vcpkg | vcpkg.io](https://vcpkg.io/en/) - vcpkg private registries allow re-direction of OSS acquisition to Enterprise-controlled resources for acquiring sources for a dependency, to minimize risk of upstream or over-the-wire attacks. From de91de7e1116875699834d68514e6fcadd621222 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 14:41:01 -0700 Subject: [PATCH 0102/1931] Resolve Acrolinx reported issues for section 2.2 --- docs/code-quality/build-reliable-secure-programs.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 1650faef80..a1753e250a 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -63,7 +63,7 @@ Establish systems to measure compliance using clear metrics. Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. Having a clear inventory lets you evaluate review outputs for patterns, and make intelligent decisions on how to refine the product security program regularly. -Try to combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools. Combining them enables you to automate a viewpoint of relative risk of a given product (ideally as a "dashboard"), to inform your security teams what to focus on to get the best value out of the threat modeling. +Try to combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools. Combining them enables you to automate a viewpoint of relative risk of a given product, ideally as a "dashboard," to inform your security teams what to focus on to get the best value out of the threat modeling. ## 2.2 Automated testing @@ -75,7 +75,7 @@ Automated tests are an important way to ensure the quality and safety of your co Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should have corresponding tests to ensure the long-term security and reliability of the code when possible. The best way to ensure automated tests are run and cover all areas is to have them running in as many environments as possible: -- The first place they should run is on the machine that is making the changes. This is most easily done within the IDE that is being used for editing, or as a script on the command line as the developer makes the changes. +- The first place they should run is on the machine that is making the changes. Running tests is most easily done within the IDE that is being used for editing, or as a script on the command line as the developer makes the changes. - The next place they should run is as part of the pull request commit/merge process. - The last place to run tests is as part of a Continuous Integration and Continuous Deployment (CI/CD) pipeline, or on your release candidate builds. @@ -83,19 +83,19 @@ The scope of the tests should increase at each step, with the last step providin **Continuous use and maintenance** -Test reliability is an important part of maintaining the effectiveness of the testing suite. Test failures should be assigned and investigated, with potential security issues getting high priority and getting updated within a prompt and predetermined timeframe. Ignoring test failures shouldn't be a common practice, but should require strong justification and approval. Test failures due to issues within the test suite itself should be treated the same as other failures, as this presents a lapse in coverage and can cause product issues to be missed. +Test reliability is an important part of maintaining the effectiveness of the testing suite. Test failures should be assigned and investigated, with potential security issues getting high priority and getting updated within a prompt and predetermined timeframe. Ignoring test failures shouldn't be a common practice, but should require strong justification and approval. Test failures due to issues within the test suite itself should be treated the same as other failures, to prevent a lapse in coverage in which product issues could be missed. **Kinds of tests, especially unit tests** -There are several types of automated tests, and while not all are applicable to all applications, a good test suite will contain a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of these can be run quickly and often. As part of the wider test infrastructure running remotely, these tests can also easily be run on multiple machine hardware setups, which can catch issues that can't always be reproduced on a single developer's machine. +There are several types of automated tests, and while not all are applicable to all applications, a good test suite contains a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of tests can be run quickly and often. If possible, run tests on many machines that have different hardware setups, because this will catch problems that aren't reproducible on a single type of machine. **Visual Studio** -Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks and options to install extensions for more frameworks. This is helpful for running a subset of tests covering the code you're working on, as well as making it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, as well as providing helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp). +Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks, and has options to install extensions for more frameworks. This flexibility is helpful for running a subset of tests covering the code you're working on, and makes it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, and provides helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp). **In Azure and GitHub CI/CD** -Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. These validations are easily set up through Azure DevOps or GitHub [Actions](https://docs.github.com/en/actions) and can be set to run automatically and block checking in code if any of these validations fails. Having these blockers helps ensure that all code being checked in is secure based on these more rigorous checks being run. This can be done by leveraging Azure Pipelines and Azure DevOps Build Validation, as described here: +Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. You can easily set up these validations through Azure DevOps or GitHub [Actions](https://docs.github.com/en/actions), and can set them to run automatically and to block code checkins if a validation fails. Automated enforcement helps ensure that all code being checked in is secure based on these more rigorous checks being run. This can be done using Azure Pipelines and Azure DevOps Build Validation, as described here: - [Git branch policies and settings - Azure Repos](/azure/devops/repos/git/branch-policies#build-validation) - [Defining the mergeability of pull requests | GitHub Docs](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests) From 1a29ee0738321a5957a2a650602d0d3e7e98f4e1 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 14:51:12 -0700 Subject: [PATCH 0103/1931] Fix Acrolinx diagnostics for 2.3 --- .../code-quality/build-reliable-secure-programs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index a1753e250a..70d1e8c3f1 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -102,13 +102,13 @@ Tests that do deeper verification and take longer to run, such as static analysi ## 2.3 Code-based, or static, analysis -**Summary** Static code/binary analysis should be enabled by default, to be secure by default. Static analysis is a compiler technology that analyzes a program (either in source code form or in compiled executable form) for required safety and security policies when it's being built, not at execution time when an exploit can occur on the customer's machine. +**Summary** Static code/binary analysis should be enabled by default, to be secure by default. Static analysis analyzes a program for required safety and security policies at the time it's being built, not at execution time when an exploit can occur on the customer's machine. Static analysis can analyze the program in source code form or in compiled executable form. **Recommendations** Microsoft recommends that you: -- Enable static analysis for all C++ programs, for both the input source code (pre-compilation) and the executable binaries (post-compilation). Note that "enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. +- Enable static analysis for all C++ programs, for both the input source code (pre-compilation) and the executable binaries (post-compilation). "Enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. - Incorporate static analysis into CI pipelines as a form of testing. -- Be aware that static analysis by definition comes with false positives, and be prepared to incorporate that fact into your quality feedback loop. Be quick to enable all low-false-positive warnings up front. Then be proactive to gradually increase the number of rules for which your code base will compile warning-clean as you regularly add more rules that flag important bugs at the expense of gradually higher false positives (initially, before the code base has been cleaned for those too). +- Static analysis by definition comes with false positives, and be prepared to incorporate that fact into your quality feedback loop. Be quick to enable all low-false-positive warnings up front. Then be proactive to gradually increase the number of rules for which your code base compiles warning-clean as you regularly add more rules that flag important bugs at the expense of gradually higher false positives (initially, before the code base has been cleaned for those rules too). - Always use the latest supported versions of Visual Studio, and set up your engineering environment to be able to quickly consume the latest patch releases as soon as they become available, without delaying to the next development stage/cycle. **Key tools** Be aware of and use the following: @@ -123,11 +123,11 @@ Tests that do deeper verification and take longer to run, such as static analysi Notes: -- `/analyze` enables static analysis of C++ code at compile time to identify critical security and reliability code vulnerabilities. It should be enabled throughout a C++ program's entire development timeline. Start by enabling at least the "Microsoft Native Recommended" by default as a minimum baseline, then consult the documentation for how to specify additional rules beyond those, notably the C++ Core Guidelines rules, as required by your engineering policies. The source code Static Analysis capability is available in both the Visual C++ IDE and in the command-line Build Tools. -- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). Note that these include warnings from the compiler back-end that can and do find uninitialized uses that other static analysis tools can't, because the compiler does perform interprocedural analysis and inlining when the checking runs. -- BinSkim binary analysis ensures that projects enable a broad range of security features and generate outputs (such as PDBs) that maximize chain-of-custody verification and efficiency of security response. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. Consult the BinSkim User Guide linked above for how to install and run the binary analyzer, and the full list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Microsoft recommends caution and selectively fixing issues reported as "warnings," as resolving these problems may have performance implications or simply may not be required for all scenarios. +- `/analyze` enables static analysis of C++ code at compile time to identify critical security and reliability code vulnerabilities. It should be enabled throughout a C++ program's entire development timeline. Start by enabling at least the "Microsoft Native Recommended" by default as a minimum baseline. Then consult the documentation for how to specify more rules, especially the C++ Core Guidelines rules, as required by your engineering policies. The source code Static Analysis capability is available in both the Visual C++ IDE and in the command-line Build Tools. +- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable warnings from the compiler back-end that can find uninitialized data errors that other static analysis tools can't, because the errors become visible to the compiler only after back-end interprocedural analysis and inlining. +- BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates outputs, such as PDBs, that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. For issues reported as only "warnings," be cautious and address them selectively, because resolving these problems can have performance implications or may not be required for all scenarios. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Running source code analysis in context of the local developer machine will prevent introduction of issues early and lower overall costs. The rate-of-introduction of binary-level issues tends to be slower than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Running source code analysis in context of the local developer machine prevents introduction of bugs early, and lowers overall costs. The rate-of-introduction of binary-level issues tends to be slower than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. ## 2.4 Review for hardcoded secrets From 838597a9d73a7065a855e839388d427911d2eb38 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 15:09:06 -0700 Subject: [PATCH 0104/1931] Address section 2.4 Acrolinx issues --- .../build-reliable-secure-programs.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 70d1e8c3f1..6cb156e3b2 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -127,17 +127,17 @@ Notes: - `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable warnings from the compiler back-end that can find uninitialized data errors that other static analysis tools can't, because the errors become visible to the compiler only after back-end interprocedural analysis and inlining. - BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates outputs, such as PDBs, that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. For issues reported as only "warnings," be cautious and address them selectively, because resolving these problems can have performance implications or may not be required for all scenarios. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Running source code analysis in context of the local developer machine prevents introduction of bugs early, and lowers overall costs. The rate-of-introduction of binary-level issues tends to be slower than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Source code bugs usually outnumber binary level bugs, so you should run source code analysis right on the local developer's machine to catch source bugs as early as possible and minimize overall costs. Binary-level issues tends to be introduced more slowly than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. ## 2.4 Review for hardcoded secrets **Summary** -Don't hardcode secrets within software. To find and remove secrets from the source code, it's most efficient to use a reliable tool that can scan the entire source code and find them. Once found, move them to a safe place following the guideline for secure storage and use of secrets. +Don't hardcode secrets within software. You can find and remove secrets from the source code efficiently by using reliable tools that can scan your entire source code base. Once you find secrets, move them to a safe place following the guideline for secure storage and use of secrets. **Problem** -Secrets for software refer to entities that establish identity and provide access to resources or are used to protect important or sensitive data by signing or encrypting the data (for example, passwords, storage keys, connection strings, private keys). It's tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets (either in plain text or encrypted but with easily discoverable decryption key) can lead to severe or catastrophic security incidents as they're easily discovered and can be used to compromise your service and data. +"Secrets" means entities that establish identity and provide access to resources, or that are used to protect important or sensitive data by signing or encrypting the data. Examples include passwords, storage keys, connection strings, and private keys. It's tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets can lead to severe or catastrophic security incidents as they're easily discovered and can be used to compromise your service and data. **Prevention** @@ -148,7 +148,7 @@ Secrets hardcoded in source code (as plain text or encrypted blob) are a securit - Don't store clear text credentials in SharePoint, OneNote, file shares, and so on. Or share them via email, IM, and so on. - Don't encrypt a secret with an easily discoverable decryption key. For example, don't store a PFX file along with a file that contains its password. - Don't encrypt a secret with a weak decryption. For example, don't encrypt a PFX file with a weak or common password. -- Avoid putting encrypted credentials in source code. Instead, use placeholders in your source that will be replaced with secrets from approved stores using the capabilities provided by your chosen deployment system. See below for more details. +- Avoid putting encrypted credentials in source code. Instead, use placeholders in your source, and let your deployment system replace them with secrets from approved stores. - Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target non-production systems as they're less well managed, then use them to pivot into production. - Don't share secrets between deployments (for example, testing, staging, production). @@ -166,9 +166,9 @@ Legacy components of your product may contain hidden hardcoded secrets in their **Remediation** -When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. If there's a running system that needs to stay up, if a secret manager needs to be put into play, remediation should follow these steps: +When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. Even if your system needs to stay running, you can enable a secret manager for remediation using these steps: -1. If remediation allows switch-over to managed identities or requires dropping in a secret manager such as Azure Key Vault (AKV), complete that work, and redeploy with updated identity/key. +1. If remediation allows switching over to managed identities, or requires dropping in a secret manager such as Azure Key Vault (AKV), first complete that work and then redeploy with updated identity or key. 1. Invalidate the exposed secret. 1. Perform auditing/risk assessment of potential damage due to compromise. @@ -176,7 +176,7 @@ To safeguard cryptographic keys and other secrets used by cloud apps and service If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. -Remove the (now-invalidated) secrets from your source code and replace them with alternative methods that won't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using MSI, dMSI, Azure AD, dKDS, and so on. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more details, see: +Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like MSI, dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more details, see: - [MSI: Server to server authentication](https://review.learn.microsoft.com/identity/microsoft-identity-platform/msa-server-to-server?branch=main) - [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) @@ -197,7 +197,7 @@ AzDO users can scan their code through Microsoft Defender for DevOps for known t Secret scanning is available on GitHub.com in two forms: - *Secret scanning alerts for partners.* Runs automatically on all public repositories. Any strings that match patterns that were provided by secret scanning partners are reported directly to the relevant partner. -- *Secret scanning alerts for users.* You can enable and configure additional scanning for repositories owned by organizations that use GitHub Enterprise Cloud and have a license for GitHub Advanced Security. This includes private and internal repositories. +- *Secret scanning alerts for users.* You can enable and configure extra scanning for repositories owned by organizations that use GitHub Enterprise Cloud and have a license for GitHub Advanced Security. These tools also support private and internal repositories. GitHub provides known patterns of secrets for partners and users that can be configured to meet your needs. For more details, please see: From ddcc7511d3e6e7847f9a3768656a9ecc722c4411 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 15:18:55 -0700 Subject: [PATCH 0105/1931] Address section 2.5's Acrolinx issues --- .../build-reliable-secure-programs.md | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 6cb156e3b2..798a29c4e1 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -219,13 +219,18 @@ GitHub provides known patterns of secrets for partners and users that can be con **Summary** -Binary hardening is done by applying compile-time security controls. These include mitigations that prevent exploitable vulnerabilities in code, enable runtime detections that trigger security defenses on exploitation, and enable data production and archiving intended to limit damage caused by security incidents. Binary consumers must opt into Windows security features to gain maximal benefit from hardening. +Binary hardening is done by applying compile-time security controls. These include mitigations that: +- prevent exploitable vulnerabilities in code, +- enable runtime detections that trigger security defenses on exploitation, and +- enable data production and archiving to help limit the damage caused by security incidents. + +Binary consumers must opt into Windows security features to gain the full benefit of hardening. Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains a public OSS binary checker, BinSkim, that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) -Binary-level controls differ according to where they're applied in the engineering process. It's useful to distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. +Binary-level controls differ according to where they're applied in the engineering process. You should distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. -Developer settings will tend towards enabling maximal static analysis, the production of private data to accelerate debugging, and so on. Release builds will be tuned to an appropriate combination of security, performance, and other code generation concerns. Release processes must be configured to properly generate and manage public vs. privately consumed build data (for example, public vs. private symbols). +Developer settings should prefer to enable as much static analysis as possible, enable production of private data to accelerate debugging, and so on. Release builds should be tuned to an appropriate combination of security, performance, and other code generation concerns. Release processes must be configured to properly generate and manage public vs. privately consumed build data (for example, public vs. private symbols). **Stay current: Always use up-to-date compilers and tools** @@ -248,14 +253,14 @@ Binaries shouldn't link to insecure libraries and dependencies. Development team Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response in the event of compromise. The following compiler switches generate information that is critical to a security response: -- [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - All PDB source file hashes should be generated by a cryptographically secure algorithm. -- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, builds should produce and archive private PDBs for all released binaries. Full symbols are required by binary analysis tools to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, lowering debugging and investigation costs when engineers are racing to assess, limit and correct damage to organizations when code has been exploited by an attacker. +- [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - Ensures that all PDB source file hashes are generated by a cryptographically secure algorithm. +- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, ensure that builds produce and archive private PDBs for all released binaries. Binary analysis tools require full symbols to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, and lower debugging and investigation costs when engineers are racing to assess and limit damage when code is exploited by an attacker. - [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](../build/reference/sourcelink.md): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of pre-release security validations and post-release incident response. **Enable compiler errors to prevent issues at code authoring time** Compilation should enable security-relevant compiler checks as breaking errors, for example: -- [`/sdl` in Visual C++ - Enable additional security checks](https://aka.ms/AdditionalSecurityChecks) elevates many security-relevant warnings into errors and sets additional secure code-generation features. +- [`/sdl` in Visual C++ - Enable additional security checks](https://aka.ms/AdditionalSecurityChecks) elevates many security-relevant warnings into errors and enables additional secure code-generation features. - [BinSkim BA2007.EnableCriticalCompilerWarnings | GitHub](https://github.com/microsoft/binskim/blob/main/src/BinSkim.Rules/PERules/BA2007.EnableCriticalCompilerWarnings.cs) maintains a list of Microsoft-recommended C/C++ compiler warnings that should always be enabled and elevated to errors. **Mark binaries as compatible with OS runtime security mitigations** @@ -272,13 +277,13 @@ Compiler settings should opt into code generation features that detect and mitig - [`/CETCOMPAT` - CET shadow stack compatible](https://aka.ms/CETShadowStack) - Marks an executable image as compatible with Microsoft's implementation of Intel's [Control-flow Enforcement Technology (CET)](https://www.intel.com/content/www/us/en/developer/articles/technical/technical-look-control-flow-enforcement-technology.html) Shadow Stack feature. - [`/guard:ehcont` - Enable EH continuation metadata](../build/reference/guard-enable-eh-continuation-metadata.md) - Generates a list of safe relative virtual addresses (RVA) of all exception handling continuation targets. - Data execution prevention - - [`/NXCOMPAT` - Compatible with Data Execution Prevention](https://aka.ms/DataExecutionPrevention) - Marks a 32-bit executable image as compatible with the [Windows Data Execution Prevention](https://support.microsoft.com/topic/what-is-data-execution-prevention-dep-60dabc2b-90db-45fc-9b18-512419135817) feature. (A 64-bit build has this by default.) + - [`/NXCOMPAT` - Compatible with Data Execution Prevention](https://aka.ms/DataExecutionPrevention) - Marks a 32-bit executable image as compatible with the [Windows Data Execution Prevention (DEP)](https://support.microsoft.com/topic/what-is-data-execution-prevention-dep-60dabc2b-90db-45fc-9b18-512419135817) feature. 64-bit builds are compatible with DEP by default.) **Prevent sensitive information disclosure** Compiler settings should opt into sensitive information discovery prevention. In recent years, researchers have uncovered unintended information leakage that originates with hardware features such as speculative execution. -At the software level, confidential data may be transmitted to attackers if unexpectedly leaked. Failure to zero-initialize buffers and other buffer misuse may leak private confidential data to attackers that call trusted API. This class of problem best handled by enabling additional static analysis and the use of secure resource containers as described previously. +At the software level, confidential data may be transmitted to attackers if unexpectedly leaked. Failure to zero-initialize buffers and other buffer misuse may leak private confidential data to attackers that call trusted API. This class of problem best handled by enabling extra static analysis and using secure resource containers as described previously. - [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that helps prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](../cpp/spectre.md) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. From fba28284673df63765f4f2814bab63415bf09ff1 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 15:25:05 -0700 Subject: [PATCH 0106/1931] Apply section 2.5 issue resolutions for Acrolix diagnostics --- docs/code-quality/build-reliable-secure-programs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 798a29c4e1..4d11cb3221 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -291,25 +291,25 @@ At the software level, confidential data may be transmitted to attackers if unex **Summary** -Black box tests are tests that validate the components without knowledge or need of the inner workings, they're meant to test the end-to-end functionality of the features in the product at virtually at any layer or level. These include all functional tests, UI tests, performance tests, and integration tests. These are valuable for covering general reliability and functional correctness, and ensuring the product behaves as expected. +Black box tests don't rely on knowing the tested component's inner workings. Black box tests are designed to test the end-to-end functionality of the features in the product at at any layer or level. Black box tests can be functional tests, UI tests, performance tests, and integration tests. Black box tests are valuable for measuring general reliability and functional correctness, and ensuring that the product behaves as expected. **Relation to other sections** -These types of requirement-based tests are useful for validating the assumptions made in the Threat Model as well as covering potential threats as brought up in that section. These tests are useful for testing the integration between separate components of the product, especially ones that are across trust boundaries as described in the threat model. Black box test cases are also useful for testing all kinds of edge cases for user input validation. Both known edge case and error case testing is useful, as well as Fuzzing for less obvious cases. +These types of requirement-based tests are useful for validating the assumptions made in the Threat Model and covering potential threats as brought up in that section. These tests are useful for testing the integration between separate components of the product, especially ones that are across trust boundaries as described in the threat model. Black box test cases are also useful for testing all kinds of edge cases for user input validation. Testing known edge cases and error cases are both useful. Fuzzing is also useful to test less obvious cases. **Automation and regression** -Run these tests on a regular basis and compare the results to previous runs to catch breaking changes or performance regressions. Also, running these tests on many different machines and installation setups can help cover any issues that may arise from different architectures or setup changes. +Run these tests regularly, and compare the results to previous runs to catch breaking changes or performance regressions. Also, running these tests on many different machines and installation setups can help cover any issues that may arise from different architectures or setup changes. **Crash dumps** -These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import those into Visual Studio to further investigate what areas are hitting these issues. Along with that, functional tests can be run from within the Visual Studio IDE, making replicating failures and debugging them to see exactly where within the black box of the product the test fails easily, as well as testing code changes and fixes quickly. +These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import the dumps directly into Visual Studio to further investigate what parts of the code are hitting these issues. Running functional tests from within Visual Studio makes it easy to replicate and debug failures, by showing you exactly where within the black box of the product the test fails, and by letting you test code changes and fixes quickly. To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/debug-unit-tests-with-test-explorer) **In Azure** -Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, as well as run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: +Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, and to run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: - [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](/azure/devops/test/overview) - [Run automated tests from test plans - Azure Test Plans](/azure/devops/test/run-automated-tests-from-test-hub) From 90c5c31da296e97a4d03d42905dd6788b648897e Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 15:50:22 -0700 Subject: [PATCH 0107/1931] Apply fixes for Acrolinx diagnostics in remaining sections --- .../build-reliable-secure-programs.md | 64 ++++++++++--------- 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 4d11cb3221..8de3a15328 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -25,7 +25,7 @@ Threat modeling should be one part of your dynamic Security Development Lifecycl 1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. 1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. -1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After creating a baseline threat model early, plan to iterate on it as the attack surface changes. +1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After you create a baseline threat model, plan to continue iterating on it as the attack surface changes. 1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This approach enables better automated risk assessment and focusing of security efforts on the specific components or features that change. 1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) @@ -61,7 +61,7 @@ Establish systems to measure compliance using clear metrics. *Scale* -Keep a proper asset inventory system, that captures and preserves security artifacts and the output of threat model reviews. Having a clear inventory lets you evaluate review outputs for patterns, and make intelligent decisions on how to refine the product security program regularly. +Keep a proper asset inventory system that captures and preserves security artifacts and the output of threat model reviews. Having a clear inventory lets you evaluate review outputs for patterns, and make intelligent decisions on how to refine the product security program regularly. Try to combine requirements-phase security questionnaires, threat modeling results, security assessment results, and results from automated tools. Combining them enables you to automate a viewpoint of relative risk of a given product, ideally as a "dashboard," to inform your security teams what to focus on to get the best value out of the threat modeling. @@ -91,7 +91,7 @@ There are several types of automated tests, and while not all are applicable to **Visual Studio** -Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks, and has options to install extensions for more frameworks. This flexibility is helpful for running a subset of tests covering the code you're working on, and makes it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, and provides helpful tools such as CodeLens to make it easier to manage these tests. For help writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp). +Visual Studio Test Explorer natively supports many of the most popular C++ testing frameworks, and has options to install extensions for more frameworks. This flexibility is helpful for running a subset of tests covering the code you're working on, and makes it easy to debug test failures as they arise. Visual Studio also makes it easy to set up new test suites for existing projects, and provides helpful tools such as CodeLens to make it easier to manage these tests. For more information about writing, running, and managing C/C++ tests with Visual Studio, see [Write unit tests for C/C++ - Visual Studio (Windows)](/visualstudio/test/writing-unit-tests-for-c-cpp). **In Azure and GitHub CI/CD** @@ -106,7 +106,7 @@ Tests that do deeper verification and take longer to run, such as static analysi **Recommendations** Microsoft recommends that you: -- Enable static analysis for all C++ programs, for both the input source code (pre-compilation) and the executable binaries (post-compilation). "Enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. +- Enable static analysis for all C++ programs, for both the input source code (before compilation) and the executable binaries (after compilation). "Enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. - Incorporate static analysis into CI pipelines as a form of testing. - Static analysis by definition comes with false positives, and be prepared to incorporate that fact into your quality feedback loop. Be quick to enable all low-false-positive warnings up front. Then be proactive to gradually increase the number of rules for which your code base compiles warning-clean as you regularly add more rules that flag important bugs at the expense of gradually higher false positives (initially, before the code base has been cleaned for those rules too). - Always use the latest supported versions of Visual Studio, and set up your engineering environment to be able to quickly consume the latest patch releases as soon as they become available, without delaying to the next development stage/cycle. @@ -127,7 +127,7 @@ Notes: - `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable warnings from the compiler back-end that can find uninitialized data errors that other static analysis tools can't, because the errors become visible to the compiler only after back-end interprocedural analysis and inlining. - BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates outputs, such as PDBs, that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. For issues reported as only "warnings," be cautious and address them selectively, because resolving these problems can have performance implications or may not be required for all scenarios. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Source code bugs usually outnumber binary level bugs, so you should run source code analysis right on the local developer's machine to catch source bugs as early as possible and minimize overall costs. Binary-level issues tends to be introduced more slowly than in program code. And so it may be sufficient to run this analysis in less frequent pre-release CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Source code bugs usually outnumber binary level bugs, so you should run source code analysis right on the local developer's machine to catch source bugs as early as possible and minimize overall costs. Binary-level issues tends to be introduced more slowly than in program code. And so it may be sufficient to run this analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. ## 2.4 Review for hardcoded secrets @@ -176,7 +176,7 @@ To safeguard cryptographic keys and other secrets used by cloud apps and service If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. -Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like MSI, dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more details, see: +Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like MSI, dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: - [MSI: Server to server authentication](https://review.learn.microsoft.com/identity/microsoft-identity-platform/msa-server-to-server?branch=main) - [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) @@ -186,7 +186,7 @@ Remove the now-invalidated secrets from your source code, and replace them with **Azure DevOps (AzDO)** -AzDO users can scan their code through Microsoft Defender for DevOps for known types of secrets. Defender for DevOps, a service available in Defender for Cloud, empowers security teams to manage DevOps security across multi-pipeline environments. Defender for DevOps is current in preview, available for free trial. Defender for DevOps provides the scanning service through GitHub Advanced Security for Azure DevOps (GHAS for AzDO). For more details on how to detect hardcoded secrets in code in Azure DevOps, see "Detect exposed secrets in code" in the following list of links: +AzDO users can scan their code through Microsoft Defender for DevOps for known types of secrets. Defender for DevOps, a service available in Defender for Cloud, empowers security teams to manage DevOps security across multi-pipeline environments. Defender for DevOps is current in preview, available for free trial. Defender for DevOps provides the scanning service through GitHub Advanced Security for Azure DevOps (GHAS for AzDO). For more information on how to detect hardcoded secrets in code in Azure DevOps, see "Detect exposed secrets in code" in the following list of links: - [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) - [GitHub advanced security for Azure DevOps (GHAS for AzDO) | GitHub](https://partner.github.com/2022/10/12/azure-devops-article.html) @@ -199,7 +199,7 @@ Secret scanning is available on GitHub.com in two forms: - *Secret scanning alerts for partners.* Runs automatically on all public repositories. Any strings that match patterns that were provided by secret scanning partners are reported directly to the relevant partner. - *Secret scanning alerts for users.* You can enable and configure extra scanning for repositories owned by organizations that use GitHub Enterprise Cloud and have a license for GitHub Advanced Security. These tools also support private and internal repositories. -GitHub provides known patterns of secrets for partners and users that can be configured to meet your needs. For more details, please see: +GitHub provides known patterns of secrets for partners and users that can be configured to meet your needs. For more information, please see: - [Secret scanning patterns](https://docs.github.com/en/code-security/secret-scanning/secret-scanning-patterns#supported-secrets-for-user-alerts) - [About secret scanning in GitHub](https://docs.github.com/en/enterprise-cloud@latest/code-security/secret-scanning/about-secret-scanning) @@ -226,7 +226,7 @@ Binary hardening is done by applying compile-time security controls. These inclu Binary consumers must opt into Windows security features to gain the full benefit of hardening. -Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains a public OSS binary checker, BinSkim, that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) +Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains BinSkim, a public OSS binary checker that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) Binary-level controls differ according to where they're applied in the engineering process. You should distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. @@ -234,7 +234,7 @@ Developer settings should prefer to enable as much static analysis as possible, **Stay current: Always use up-to-date compilers and tools** -Compile all code with current toolsets to benefit from up-to-date language support, static analysis, code generation and security controls. Because compilers impact every generated component, the potential for regression on tool update is relatively high. Using outdated compilers creates a particular risk for corrective action in the event of a security incident because teams may not be able to rapidly upgrade compilers in response. Microsoft recommends that teams develop the facility to regularly refresh and test compiler updates. +Compile all code with current toolsets to benefit from up-to-date language support, static analysis, code generation and security controls. Because compilers impact every generated component, the potential for regression on tool update is relatively high. Using outdated compilers creates a particular risk for corrective action while responding to a security incident, because teams may not have enough time to upgrade compilers. Microsoft recommends that teams develop the facility to regularly refresh and test compiler updates. **Use secure development methods, language versions, frameworks/APIs** @@ -251,11 +251,11 @@ Binaries shouldn't link to insecure libraries and dependencies. Development team **Maximize code provenance guarantees and efficiency of security response** -Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response in the event of compromise. The following compiler switches generate information that is critical to a security response: +Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response if they are compromised. The following compiler switches generate information that is critical to a security response: - [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - Ensures that all PDB source file hashes are generated by a cryptographically secure algorithm. - [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, ensure that builds produce and archive private PDBs for all released binaries. Binary analysis tools require full symbols to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, and lower debugging and investigation costs when engineers are racing to assess and limit damage when code is exploited by an attacker. -- [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](../build/reference/sourcelink.md): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of pre-release security validations and post-release incident response. +- [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](../build/reference/sourcelink.md): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of prerelease security validations and post-release incident response. **Enable compiler errors to prevent issues at code authoring time** @@ -285,7 +285,7 @@ Compiler settings should opt into sensitive information discovery prevention. In At the software level, confidential data may be transmitted to attackers if unexpectedly leaked. Failure to zero-initialize buffers and other buffer misuse may leak private confidential data to attackers that call trusted API. This class of problem best handled by enabling extra static analysis and using secure resource containers as described previously. -- [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that helps prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](../cpp/spectre.md) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. +- [`/Qspectre` - Mitigate speculative execution side-channel attacks](https://aka.ms/SpectreMitigations) - Inserts barrier instructions that help prevent the disclosure of sensitive data produced by speculative execution. These mitigations should be enabled for code that stores sensitive data in memory and operates across a trust boundary. Microsoft always recommends measuring performance impact against appropriate benchmarks when enabling Spectre-mitigations due to the possibility of introducing runtime checks in performance-critical blocks or loops. These code paths can disable mitigations via the [`spectre(nomitigation)`](../cpp/spectre.md) `declspec` modifier. Projects that enable `/Qspectre`` should also link to libraries that are also compiled with these mitigations, including the Microsoft runtime libraries. ## 2.6 Black box test cases @@ -317,26 +317,32 @@ Azure DevOps can also help manage and validate these tests with the use of Test **Summary** -Code-based test cases are an integral part of maintaining the security and reliability of your product. These tests should be small and fast and shouldn't have an impact on each other so they can be run in parallel. This makes it easy for developers to run these tests locally on their machine any time they make changes to the code without worrying about slowing down their development cycle. +Code-based test cases are an integral part of maintaining the security and reliability of your product. These tests should be small and fast and shouldn't have an impact on each other so they can be run in parallel. Code-based tests are easy for developers to run locally on their development machine anytime they make changes to the code without worrying about slowing down their development cycle. **Types, and relation to other sections** -Common types of code-based test cases include unit tests, parameterized tests to cover functions with multiple input types, component testing to keep each test component separate, and mock testing to validate parts of the code that communicate with other services, without expanding the scope of the test to include those services themselves. As opposed to black box style tests, these tests are based on the code that is written instead of the functional requirements of the product. +Common types of code-based test cases include: +- unit tests, +- parameterized tests to cover functions with multiple input types, +- component tests to keep each test component separate, and +- mock testing to validate parts of the code that communicate with other services, without expanding the scope of the test to include those services themselves. + +These tests are based on the internal code that is written, whereas black box tests are based on the external functional requirements of the product. **Goal** -Through these tests, the goal is to achieve a high level of test coverage over your code. By actively tracking this coverage and its gaps, adding more tests that exercise all code paths will increase the confidence that your code is secure and reliable when any changes are made. +Through these tests, the goal is to achieve a high level of test coverage over your code. You should actively track this coverage and its gaps, so that adding more tests that exercise all code paths increases the confidence that your code is secure and reliable when any changes are made. **Visual Studio** -The test explorer tools in Visual Studio make it easy to run these tests frequently and get feedback on pass/fail rates and failure locations quickly. On top of this, many of the test frameworks support CodeLens features to see the test status at the location of the test itself, making adding and maintaining the suite of tests much easier. The Test Explorer also makes managing these tests easy, allowing for test groups, custom test playlists, filtering, sorting, searching, and more. +The test explorer tools in Visual Studio make it easy to run these tests frequently and get feedback on pass/fail rates and failure locations quickly. Many of the test frameworks also support CodeLens features to see the test status at the location of the test itself, making adding and maintaining the suite of tests easier. The Test Explorer also makes managing these tests easy, allowing for test groups, custom test playlists, filtering, sorting, searching, and more. For more information, see: - [Unit testing fundamentals - Visual Studio (Windows)](/visualstudio/test/unit-test-basics) - an introduction and overview - [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) - a deeper look at what's available to help manage the potentially large set of unit tests with the Test Explorer -Visual Studio also comes with tools for tracking the code coverage that allow developers to ensure that code changes they make are covered by existing tests, or adding new tests to cover new and untested code paths. It also shows the code coverage percentage to ensure it's maintained above a target level for confidence in overall code quality. +Visual Studio also comes with tools for tracking the code coverage. These tools enable you to ensure that code changes you make are covered by existing tests, or to add new tests to cover new and untested code paths. The tools also show the code coverage percentage to ensure it's maintained above a target level for confidence in overall code quality. For information about these tools, see [Code coverage testing - Visual Studio (Windows)](/visualstudio/test/using-code-coverage-to-determine-how-much-code-is-being-tested) @@ -348,7 +354,7 @@ Azure DevOps can also help in tracking code coverage results for the whole produ **Summary** -Historical test cases are extremely helpful to prevent issues from showing up more than once, as well as increasing the overall test coverage of the product. By ensuring that bug fixes are accompanied by corresponding tests, over time as fixes are made the overall robustness of the testing suite will keep improving, giving better assurances of reliability and security. +Historical test cases, also known as regression test cases, prevent old issues from resurfacing again and increase the overall test coverage of the product. You should ensure that when a bug is fixed the project also adds a corresponding test cases. Over time, as fixes are made, the overall robustness of the testing suite will keep improving, giving better assurances of reliability and security. **Key qualities, and relation to other sections** @@ -356,11 +362,11 @@ Since they test for bug regressions, these tests should be quick and easy to run **Visual Studio** - Using Visual Studio, it's easy to add tests to the suite when making the changes to fix the bug, and then quickly run the tests and code coverage to ensure all new cases are considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. For even more robust tracking, using Azure DevOps boards, test plans, and Visual Studio to associate tests, test cases, and issues can keep track of all aspects of an issue and its corresponding tests. For more information, see: +Visual Studio makes it easy to add tests to the suite while making the changes to fix the bug, and then to quickly run the tests and code coverage to ensure all new cases get considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. For even more robust tracking, you can use Azure DevOps boards and test plans together with Visual Studio to associate tests, test cases, and issues, and track of all aspects of an issue and its corresponding tests. For more information, see: - [Associate automated tests with test cases - Azure Test Plans](/azure/devops/test/associate-automated-test-with-test-case) - [Link work items to other objects - Azure DevOps](/azure/devops/organizations/notifications/add-links-to-work-items) -Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. Leveraging the Test Explorer's test grouping is a good way to keep track of tests that belong together as well. For more information, see [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) +Eventually, integrating these tests into the unit testing area that is supposed to cover the code section helps keep the test suite organized and easier to manage. You can use the Test Explorer's test grouping to effectively track the tests that belong together. For more information, see [Run unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/run-unit-tests-with-test-explorer#group-and-filter-the-test-list) ## 2.9 Fuzzing @@ -375,9 +381,9 @@ Use fuzzing on all software that may process untrusted inputs that an attacker c When fuzzing reports a failure, it always naturally provides a reproducible test case that demonstrates the bug. This test case can be reproduced, resolved, and then added to the Historical Test Cases. -When using both sanitizers such as [Address Sanitizer (ASAN)](../sanitizers/asan.md) and fuzzing: +When using both sanitizers such as [Address Sanitizer (ASan)](../sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable Asan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html), which is enabled by ASAN. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html); if you enable ASan, LibFuzzer is enabled automatically. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** @@ -407,15 +413,15 @@ Within the scope of Microsoft Visual C++ on Windows, Microsoft recommends: A web application scanner explores a web application by crawling through its web pages and examines it for security vulnerabilities. This crawl involves the automatic generation of malicious inputs and evaluation of the application's responses. Critically, web application scanning must cover/support the following: - Catalogs all web apps in your network, including new and unknown ones, and scales from a handful of apps to thousands. -- Deep scanning for software versions, SOAP and REST API services and API's used by mobile devices. -- Insertion of security primitives into application development and deployment in DevOps environments. These work with the crawler. +- Deep scanning for software versions, SOAP and REST API services and APIs used by mobile devices. +- Insertion of security primitives into application development and deployment in DevOps environments. These primitives work with the crawler. - Malware detection. ## 2.11 Check Included Software Components **Summary** -C++ code should be handled the same as other programming languages, and checks should be supported by any Software Composition Analysis (SCA) and Origin Analysis (OA) tooling adopted by your company. Workflows and security scanning should be designed as part of CI/CD (continuous integration and continuous delivery) systems. +Handle your C++ code the same as code written in other programming languages, and apply any Software Composition Analysis (SCA) and Origin Analysis (OA) tooling adopted by your company to your C++ code. Workflows and security scanning should be designed as part of CI/CD (continuous integration and continuous delivery) systems. **Upstream defense** @@ -428,7 +434,7 @@ To mitigate the risk of attacks on upstream dependencies, third party sources/co Perform and maintain an audit of dependencies to validate that all such occurrences are accounted for and covered by your SCA and OA tools. - Components should be regularly audited and updated to the latest verified versions. - Package feed dependencies. -- All package dependencies come from a single feed that are covered/audited by SCA/OA tools. +- SCA/OA tools cover and audit all package dependencies that come from a single feed. **SBOM** @@ -439,7 +445,7 @@ Produce an SBOM (software bill of materials) with your product listing all depen - Require and audit SBOM files in software dependencies or produced as part of a build including OSS (open-source software). - Microsoft is standardizing on and recommends [SPDX (Software Package Data Exchange) version 2.2 or later | Linux Foundation](https://spdx.dev/specifications/) as the SBOM document format. - Build determinism can be used to independently produce bit-wise identical binaries and provide independent verifications of integrity: - - 1st party or 3rd party attestation of reproducibility + - First-party or third-party attestation of reproducibility - Other techniques such as binary signing via a trusted certificate source can also provide some assurances of binary integrity. **Additional resources** @@ -447,4 +453,4 @@ Produce an SBOM (software bill of materials) with your product listing all depen Microsoft solutions include the following guidance and products: - [Microsoft Supply Chain Platform | Microsoft](https://www.microsoft.com/microsoft-cloud/solutions/microsoft-supply-chain-platform) - [Secure your software supply chain | GitHub Security](https://github.com/features/security/software-supply-chain) -- [vcpkg | vcpkg.io](https://vcpkg.io/en/) - vcpkg private registries allow re-direction of OSS acquisition to Enterprise-controlled resources for acquiring sources for a dependency, to minimize risk of upstream or over-the-wire attacks. +- [vcpkg | vcpkg.io](https://vcpkg.io/en/) - vcpkg private registries allow redirection of OSS acquisition to Enterprise-controlled resources for acquiring sources for a dependency, to minimize risk of upstream or over-the-wire attacks. From 72572bb868a9381c2abf7a0bbbff83909c8afb6a Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Fri, 8 Sep 2023 15:57:06 -0700 Subject: [PATCH 0108/1931] Fix a couple of dangling links Removed MSI because the MSI documentation is still in preview and we can't link from public to preview --- docs/code-quality/build-reliable-secure-programs.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 8de3a15328..7359060bab 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -176,9 +176,8 @@ To safeguard cryptographic keys and other secrets used by cloud apps and service If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. -Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like MSI, dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities (MSI) via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: +Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: -- [MSI: Server to server authentication](https://review.learn.microsoft.com/identity/microsoft-identity-platform/msa-server-to-server?branch=main) - [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) - [Azure AD: Implementing auto-rotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) - [dKDS: Datacenter key distribution service](https://msazure.visualstudio.com/AzureCoreSecurityServices/_wiki/wikis/AzureCoreSecurityServices.wiki/20522/Key-Distribution-Service-(dKDS)) @@ -242,7 +241,7 @@ Code should utilize development methodologies, language versions, framework, API - See [C++ Core Guidelines' Guideline Support Library (GSL)](https://github.com/isocpp/CppCoreGuidelines) for guidance to write modern, safe, and consistent C++ code that follows best practices and avoids common pitfalls. - See [Microsoft GSL implementation](https://github.com/microsoft/GSL) for functions and types that the C++ Core Guidelines suggest you use. -- [Resource-safe C++ containers, C runtime library (CRT) memory overflow protections](???) Prefer [`std::vector`](../standard-library/vector-class.md) and [`std::string`](../standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. +- Resource-safe C++ containers, C runtime library (CRT) memory overflow protections: Prefer [`std::vector`](../standard-library/vector-class.md) and [`std::string`](../standard-library/string.md), which are resource-safe. If you must use C data, use the [secure versions of CRT functions](../c-runtime-library/security-features-in-the-crt.md), which are designed to help prevent memory corruption due to buffer misuse and undefined language behaviors. - The [SafeInt library](../safeint/safeint-library.md) protects against integer overflow in mathematical and comparison operations. **Consume secure dependencies** From fc340877a91a7f4df189643be855a9a4532de7bb Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 8 Sep 2023 16:06:01 -0700 Subject: [PATCH 0109/1931] draft --- docs/ide/include-cleanup-overview.md | 49 ++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 7 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 654a318e36..6c10fe59ee 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -1,24 +1,59 @@ --- title: "Cleanup #includes in C++ code in Visual Studio" -description: "Use the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." +description: "Learn about using the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." ms.date: 09/10/2023 ms.topic: "overview" ms.custom: intro-overview --- # Cleanup #includes in C++ code in Visual Studio -Starting in Visual Studio 17.8, Visual Studio provides #include cleanup to improves the quality of your code. It generates suggestions to remove unused headers, but can also add headers for code that you are using in your project. +Starting with Visual Studio 17.7 preview 3, Visual Studio provides an #include cleanup tool that improves the quality of your code in the following ways: +- Identifies unused headers and offers suggestions to remove them--which improves your build times. +- Add headers for code that is only working because the header for it is indirectly included by another headers. This reduces the brittleness of your code with respect to what files you # #include. + +This article shows explains what the #include cleanup tool in Visual Studio can do for you. +## Direct vs Indirect headers +First, some terminology. Direct headers are headers that you explicitly #include in your code. Indirect headers are headers that are included by other headers. Here's an example: - Our suggested workflow is to first go through the direct include suggestions to add direct headers where indirect headers are used, followed by removing the unused includes. +File: header1.h -## IntelliSense +```cpp +// header1.h +#include +void test() { std::cout << "test";} +``` -IntelliSense is a powerful code completion tool that suggests symbols and code snippets for you as you type. C++ IntelliSense in Visual Studio runs in real time, analyzing your codebase as you update it and providing recommendations. As you type more characters, the list of recommended results narrows down. +File: source.cpp +```cpp +#include "header1.h" +// you should explicitly #include because you're using std::cout in this file -![Screenshot of the C plus plus member list drop down showing the methods available for string such as append, assign, and so on.](../ide/media/cpp-statement-completion.png) +test(); // outputs "test" +std::cout << "Only works because header1.h includes "; // you should explicitly #include rather than rely on header1.h to include it +``` + +In this example, if `header1.h` is updated to no longer include ``, your code will break in `source.cpp`. Per the C++ guidelines, it's better to explicitly `#include ` in `source.cpp` so that your code isn't subject to brittleness caused by changes to header files. For more information about the guideline to avoid dependencies on names brought in implicitly when #including a header, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix these issues like this. + +## Unused headers + +As your code evolves, you may no longer need some headers. This is particularly hard to track in complex projects with many files. The C++ include cleanup tool helps you find and remove these unused headers. For example: + +```cpp + +#include +#include + +int main() +{ + int x = std::rand(); // std::rand is defined in + std::cout << "x is: " << x; + int r = std::rand +} +``` ## See Also -[Navigate your C++ code base in Visual Studio](navigate-code-cpp.md) \ No newline at end of file +the walkthrough +the reference \ No newline at end of file From 90a7b79f3d47ec5128b7e9890da30efa720625c1 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Mon, 11 Sep 2023 14:51:12 -0700 Subject: [PATCH 0110/1931] Fixed another round of Acrolinx isues --- .../build-reliable-secure-programs.md | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 7359060bab..ba5bb9bb73 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -40,7 +40,7 @@ First, understand the team's development approach. For teams with agile developm - Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. - Is this change primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. -The security questionnaire results will inform which SDL techniques to tie to which unit of development. It will also inform development partners of the feature's SDL timelines, so they can collaborate at the right times. +The security questionnaire results inform which SDL techniques to tie to which unit of development. It also informs development partners of the feature's SDL timelines, so they can collaborate at the right times. *Product inventory* @@ -57,7 +57,7 @@ In such complex products, it's not effective to require traditional SDL modeling Establish systems to measure compliance using clear metrics. - Regularly measure compliance for feature level development. Feature compliance generally should be measured with higher frequency and smaller granularity, sometimes even on the developer's system or at code commit/merge time. -- Periodically evaluate security for the broader product in which a feature or component is being consumed. Broader evaluations typically will be done with lower frequency and broader granularity, such as at module or system testing time. +- Periodically evaluate security for the broader product in which a feature or component is being consumed. Broader evaluations typically are done with lower frequency and broader granularity, such as at module or system testing time. *Scale* @@ -73,7 +73,7 @@ Automated tests are an important way to ensure the quality and safety of your co **Key attributes** -Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should have corresponding tests to ensure the long-term security and reliability of the code when possible. The best way to ensure automated tests are run and cover all areas is to have them running in as many environments as possible: +Tests should be reliable, consistent, and isolated. These tests should cover as much of the code as possible. All new features and bug fixes should have corresponding tests to ensure the long-term security and reliability of the code when possible. Run automated tests regularly and in as many environments as possible, to ensure they get run and that they cover all areas: - The first place they should run is on the machine that is making the changes. Running tests is most easily done within the IDE that is being used for editing, or as a script on the command line as the developer makes the changes. - The next place they should run is as part of the pull request commit/merge process. @@ -87,7 +87,7 @@ Test reliability is an important part of maintaining the effectiveness of the te **Kinds of tests, especially unit tests** -There are several types of automated tests, and while not all are applicable to all applications, a good test suite contains a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of tests can be run quickly and often. If possible, run tests on many machines that have different hardware setups, because this will catch problems that aren't reproducible on a single type of machine. +There are several types of automated tests, and while not all are applicable to all applications, a good test suite contains a selection of several different types. Code Based Test Cases such as unit tests are the most common and most integral, being applicable to all applications and intentionally covering as many code paths as possible for correctness. These tests should be small, quick, and not affect the state of the machine, so that the full suite of tests can be run quickly and often. If possible, run tests on many machines that have different hardware setups to catch problems that aren't reproducible on a single type of machine. **Visual Studio** @@ -95,7 +95,7 @@ Visual Studio Test Explorer natively supports many of the most popular C++ testi **In Azure and GitHub CI/CD** -Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. You can easily set up these validations through Azure DevOps or GitHub [Actions](https://docs.github.com/en/actions), and can set them to run automatically and to block code checkins if a validation fails. Automated enforcement helps ensure that all code being checked in is secure based on these more rigorous checks being run. This can be done using Azure Pipelines and Azure DevOps Build Validation, as described here: +Tests that do deeper verification and take longer to run, such as static analysis, component detection, and so on, are good candidates for pull request testing or continuous integration testing. Azure DevOps and GitHub [Actions](https://docs.github.com/en/actions) make it easy to run validations automatically and block code checkins if a validation fails. Automated enforcement helps ensure that all code being checked in is secure based on these more rigorous checks being run. Azure Pipelines and Azure DevOps Build Validation are described here: - [Git branch policies and settings - Azure Repos](/azure/devops/repos/git/branch-policies#build-validation) - [Defining the mergeability of pull requests | GitHub Docs](https://docs.github.com/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests) @@ -124,10 +124,10 @@ Tests that do deeper verification and take longer to run, such as static analysi Notes: - `/analyze` enables static analysis of C++ code at compile time to identify critical security and reliability code vulnerabilities. It should be enabled throughout a C++ program's entire development timeline. Start by enabling at least the "Microsoft Native Recommended" by default as a minimum baseline. Then consult the documentation for how to specify more rules, especially the C++ Core Guidelines rules, as required by your engineering policies. The source code Static Analysis capability is available in both the Visual C++ IDE and in the command-line Build Tools. -- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable warnings from the compiler back-end that can find uninitialized data errors that other static analysis tools can't, because the errors become visible to the compiler only after back-end interprocedural analysis and inlining. -- BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates outputs, such as PDBs, that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. For issues reported as only "warnings," be cautious and address them selectively, because resolving these problems can have performance implications or may not be required for all scenarios. +- `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable finding uninitialized data errors that other static analysis tools can't check, because the errors only become visible after the compiler back-end performs interprocedural analysis and inlining. +- BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates PDBs and other outputs that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Issues reported as "warnings" should be evaluated selectively, because resolving them can have performance implications or may not be necessary. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Source code bugs usually outnumber binary level bugs, so you should run source code analysis right on the local developer's machine to catch source bugs as early as possible and minimize overall costs. Binary-level issues tends to be introduced more slowly than in program code. And so it may be sufficient to run this analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds) rather than on every developer commit or pull request. +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Run source code analysis immediately on the local developer's machine, or at least for every commit or pull request. This helps to catch source bugs as early as possible and minimize overall costs. Binary level bugs tend to be introduced more slowly, so it may be sufficient to run binary analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds). ## 2.4 Review for hardcoded secrets @@ -137,19 +137,19 @@ Don't hardcode secrets within software. You can find and remove secrets from the **Problem** -"Secrets" means entities that establish identity and provide access to resources, or that are used to protect important or sensitive data by signing or encrypting the data. Examples include passwords, storage keys, connection strings, and private keys. It's tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets can lead to severe or catastrophic security incidents as they're easily discovered and can be used to compromise your service and data. +"Secrets" means entities that establish identity and provide access to resources, or that are used to sign or encrypt sensitive data. Examples include passwords, storage keys, connection strings, and private keys. It's tempting to keep secrets in the software product so they can be readily obtained when needed by the software. However, these hardcoded secrets can lead to severe or catastrophic security incidents as they're easily discovered and can be used to compromise your service and data. **Prevention** Secrets hardcoded in source code (as plain text or encrypted blob) are a security vulnerability. Here are general guidelines on how to avoid secrets in the source code: -- Use a pre-checkin tool to scan and catch potential hardcoded secrets in code prior submitting to source control. +- Use a precheckin tool to scan and catch potential hardcoded secrets in code prior submitting to source control. - Don't put clear text credentials in source code or configuration files. - Don't store clear text credentials in SharePoint, OneNote, file shares, and so on. Or share them via email, IM, and so on. - Don't encrypt a secret with an easily discoverable decryption key. For example, don't store a PFX file along with a file that contains its password. - Don't encrypt a secret with a weak decryption. For example, don't encrypt a PFX file with a weak or common password. - Avoid putting encrypted credentials in source code. Instead, use placeholders in your source, and let your deployment system replace them with secrets from approved stores. -- Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target non-production systems as they're less well managed, then use them to pivot into production. +- Apply the same principles to secrets in environments such as testing, staging, and so on, as you do in production deployments. Adversaries often target nonproduction systems as they're less well managed, then use them to pivot into production. - Don't share secrets between deployments (for example, testing, staging, production). While not directly related to hardcoded secrets, also remember securing secrets for your test, development, and production: @@ -168,7 +168,7 @@ Legacy components of your product may contain hidden hardcoded secrets in their When credentials are found in your source code, the immediate urgent need is to invalidate the exposed key and perform a risk analysis based on exposure. Even if your system needs to stay running, you can enable a secret manager for remediation using these steps: -1. If remediation allows switching over to managed identities, or requires dropping in a secret manager such as Azure Key Vault (AKV), first complete that work and then redeploy with updated identity or key. +1. If remediation allows switching over to managed identities, or requires dropping in a secret manager such as Azure Key Vault (AKV), do that first. Then redeploy with the updated identity or key. 1. Invalidate the exposed secret. 1. Perform auditing/risk assessment of potential damage due to compromise. @@ -179,7 +179,7 @@ If an exposure compromises certain customer data/PII, it may require other compl Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: - [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) -- [Azure AD: Implementing auto-rotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) +- [Azure AD: Implementing autorotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) - [dKDS: Datacenter key distribution service](https://msazure.visualstudio.com/AzureCoreSecurityServices/_wiki/wikis/AzureCoreSecurityServices.wiki/20522/Key-Distribution-Service-(dKDS)) - [Key Vault & dSMS & Secrets Management: What is certificate autorotation?](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/getstartedcerts#how-do-i-procure-and-store-the-cert) @@ -225,7 +225,7 @@ Binary hardening is done by applying compile-time security controls. These inclu Binary consumers must opt into Windows security features to gain the full benefit of hardening. -Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains BinSkim, a public OSS binary checker that helps enforce use of many protections described below. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) +Microsoft provides a set of facilities specific to C++ projects to help developers write and ship safer and more secure code. C++ developers should also adhere to security standards common to languages that generate executable code. Microsoft maintains BinSkim, a public OSS binary checker that helps enforce use of many protections described in this section. For more information about BinSkim, see [Binskim user guide | GitHub](https://github.com/microsoft/binskim/blob/main/docs/UserGuide.md) Binary-level controls differ according to where they're applied in the engineering process. You should distinguish among compiler and linker options that: are strictly compile time, alter code generation with run-time overhead, and alter code generation to achieve compatibility with OS protections. @@ -250,16 +250,16 @@ Binaries shouldn't link to insecure libraries and dependencies. Development team **Maximize code provenance guarantees and efficiency of security response** -Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response if they are compromised. The following compiler switches generate information that is critical to a security response: +Compilation should enable strong code provenance guarantees to help detect and prevent introduction of backdoors and other malicious code. The resulting data, also critical to debugging and investigation, should be archived for all software releases to drive efficient security response if they're compromised. The following compiler switches generate information that is critical to a security response: -- [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - Ensures that all PDB source file hashes are generated by a cryptographically secure algorithm. -- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, ensure that builds produce and archive private PDBs for all released binaries. Binary analysis tools require full symbols to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, and lower debugging and investigation costs when engineers are racing to assess and limit damage when code is exploited by an attacker. +- [`/ZH:SHA_SHA256` in Visual C++](../build/reference/zh.md) - Ensures that a cryptographically secure algorithm is used to generate all PDB source file hashes. +- [`/Zi`, `/ZI` (Debug Information Format) in Visual C++](../build/reference/z7-zi-zi-debug-information-format.md) - In addition to publishing stripped symbols for collecting crash data and other public use scenarios, ensure that builds produce and archive private PDBs for all released binaries. Binary analysis tools require full symbols to verify whether many security mitigations were enabled at compile-time. Private symbols are critical in security response, and lower debugging and investigation costs when engineers are racing to assess and limit damage when an exploit happens. - [`/SOURCELINK` in Visual C++ Linker - Include Sourcelink file in PDB](../build/reference/sourcelink.md): Source link is a language- and source-control agnostic system providing source debugging for binaries. Source debugging greatly increases the efficiency the range of prerelease security validations and post-release incident response. **Enable compiler errors to prevent issues at code authoring time** Compilation should enable security-relevant compiler checks as breaking errors, for example: -- [`/sdl` in Visual C++ - Enable additional security checks](https://aka.ms/AdditionalSecurityChecks) elevates many security-relevant warnings into errors and enables additional secure code-generation features. +- [`/sdl` in Visual C++ - Enable additional security checks](https://aka.ms/AdditionalSecurityChecks) elevates many security-relevant warnings into errors and enables advanced secure code-generation features. - [BinSkim BA2007.EnableCriticalCompilerWarnings | GitHub](https://github.com/microsoft/binskim/blob/main/src/BinSkim.Rules/PERules/BA2007.EnableCriticalCompilerWarnings.cs) maintains a list of Microsoft-recommended C/C++ compiler warnings that should always be enabled and elevated to errors. **Mark binaries as compatible with OS runtime security mitigations** @@ -290,7 +290,7 @@ At the software level, confidential data may be transmitted to attackers if unex **Summary** -Black box tests don't rely on knowing the tested component's inner workings. Black box tests are designed to test the end-to-end functionality of the features in the product at at any layer or level. Black box tests can be functional tests, UI tests, performance tests, and integration tests. Black box tests are valuable for measuring general reliability and functional correctness, and ensuring that the product behaves as expected. +Black box tests don't rely on knowing the tested component's inner workings. Black box tests are designed to test the end-to-end functionality of the features in the product at any layer or level. Black box tests can be functional tests, UI tests, performance tests, and integration tests. Black box tests are valuable for measuring general reliability and functional correctness, and ensuring that the product behaves as expected. **Relation to other sections** @@ -302,13 +302,13 @@ Run these tests regularly, and compare the results to previous runs to catch bre **Crash dumps** -These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import the dumps directly into Visual Studio to further investigate what parts of the code are hitting these issues. Running functional tests from within Visual Studio makes it easy to replicate and debug failures, by showing you exactly where within the black box of the product the test fails, and by letting you test code changes and fixes quickly. +These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import the dumps directly into Visual Studio to further investigate what parts of the code are hitting these issues. Running functional tests from within Visual Studio makes it easy to replicate and debug failures, by letting you see into the black box to exactly where the test fails and by letting you test code changes quickly. To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/debug-unit-tests-with-test-explorer) **In Azure** -Azure DevOps can also help manage and validate these tests with the use of Test Plans. These can be used to ensure sign off with manual validation, and to run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: +Azure DevOps can also help manage and validate these tests with the use of Test Plans. These tests can be used to ensure approval with manual validation, and to run automated tests associated with product requirements. More information on Azure Test Plans and using them to run automated testing can be found here: - [What is Azure Test Plans? Manual, exploratory, and automated test tools. - Azure Test Plans](/azure/devops/test/overview) - [Run automated tests from test plans - Azure Test Plans](/azure/devops/test/run-automated-tests-from-test-hub) @@ -330,7 +330,7 @@ These tests are based on the internal code that is written, whereas black box te **Goal** -Through these tests, the goal is to achieve a high level of test coverage over your code. You should actively track this coverage and its gaps, so that adding more tests that exercise all code paths increases the confidence that your code is secure and reliable when any changes are made. +Through these tests, the goal is to achieve a high level of test coverage over your code. You should actively track this coverage and where gaps exist. As you add more tests that exercise more code paths, the overall confidence in your code's security and reliability increases. **Visual Studio** @@ -353,7 +353,7 @@ Azure DevOps can also help in tracking code coverage results for the whole produ **Summary** -Historical test cases, also known as regression test cases, prevent old issues from resurfacing again and increase the overall test coverage of the product. You should ensure that when a bug is fixed the project also adds a corresponding test cases. Over time, as fixes are made, the overall robustness of the testing suite will keep improving, giving better assurances of reliability and security. +Historical test cases, also known as regression test cases, prevent old issues from resurfacing again and increase the overall test coverage of the product. You should ensure that when a bug is fixed the project also adds a corresponding test case. Over time, as fixes are made, the overall robustness of the testing suite will keep improving, giving better assurances of reliability and security. **Key qualities, and relation to other sections** @@ -361,7 +361,7 @@ Since they test for bug regressions, these tests should be quick and easy to run **Visual Studio** -Visual Studio makes it easy to add tests to the suite while making the changes to fix the bug, and then to quickly run the tests and code coverage to ensure all new cases get considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. For even more robust tracking, you can use Azure DevOps boards and test plans together with Visual Studio to associate tests, test cases, and issues, and track of all aspects of an issue and its corresponding tests. For more information, see: +Visual Studio lets you easily add tests to the suite while making the changes to fix the bug, and quickly run the tests and code coverage to ensure all new cases get considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. You can use Azure DevOps boards and test plans together with Visual Studio to associate tests, test cases, and issues, and track of all aspects of an issue and its corresponding tests. For more information, see: - [Associate automated tests with test cases - Azure Test Plans](/azure/devops/test/associate-automated-test-with-test-case) - [Link work items to other objects - Azure DevOps](/azure/devops/organizations/notifications/add-links-to-work-items) @@ -409,7 +409,7 @@ Within the scope of Microsoft Visual C++ on Windows, Microsoft recommends: **Overview and key qualities** -A web application scanner explores a web application by crawling through its web pages and examines it for security vulnerabilities. This crawl involves the automatic generation of malicious inputs and evaluation of the application's responses. Critically, web application scanning must cover/support the following: +A web application scanner explores a web application by crawling through its web pages and examines it for security vulnerabilities. This crawl involves the automatic generation of malicious inputs and evaluation of the application's responses. Critically, web application scanning must cover/support: - Catalogs all web apps in your network, including new and unknown ones, and scales from a handful of apps to thousands. - Deep scanning for software versions, SOAP and REST API services and APIs used by mobile devices. From f4c29c07c6af54dc0368a55d40d6d3106d9903b2 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Mon, 11 Sep 2023 15:00:15 -0700 Subject: [PATCH 0111/1931] Update build-reliable-secure-programs.md --- docs/code-quality/build-reliable-secure-programs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index ba5bb9bb73..6fc655ad5f 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -1,6 +1,6 @@ --- -description: "Learn more about: Building reliable and secure apps in C++ by applying NISTIR 8397 guidelines." -title: Build reliable and secure apps in C++ +description: "Learn more about: Building reliable and secure programs by applying NISTIR 8397 guidelines." +title: Build reliable and secure programs ms.date: 09/07/2023 ms.topic: "conceptual" --- From 58ee5c5c282b5b0374debf76c15aca5cdc6d99fe Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Mon, 11 Sep 2023 15:01:25 -0700 Subject: [PATCH 0112/1931] Update build-reliable-secure-programs.md --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 6fc655ad5f..ac58704e1e 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -5,7 +5,7 @@ ms.date: 09/07/2023 ms.topic: "conceptual" --- -# Build reliable and secure apps in C++ +# Build reliable and secure programs The United States government publication [NISTIR 8397: Guidelines on Minimum Standards for Developer Verification of Software](https://nvlpubs.nist.gov/nistpubs/ir/2021/NIST.IR.8397.pdf) contains excellent guidance on how to build reliable and secure software in any programming language. From 1008a8e1a1a809bb0938cc293f6ef14e31853016 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 11 Sep 2023 16:54:02 -0700 Subject: [PATCH 0113/1931] draft --- docs/ide/include-cleanup-overview.md | 54 ++++++++++++------ .../include-cleanup-refactor-lightbulb.png | Bin 0 -> 31436 bytes .../media/vs2022_include_cleanup_option.png | Bin 0 -> 83722 bytes docs/ide/toc.yml | 2 +- 4 files changed, 38 insertions(+), 18 deletions(-) create mode 100644 docs/ide/media/include-cleanup-refactor-lightbulb.png create mode 100644 docs/ide/media/vs2022_include_cleanup_option.png diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 6c10fe59ee..0682a59aeb 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -1,55 +1,75 @@ --- title: "Cleanup #includes in C++ code in Visual Studio" description: "Learn about using the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." -ms.date: 09/10/2023 +ms.date: 09/15/2023 ms.topic: "overview" ms.custom: intro-overview --- # Cleanup #includes in C++ code in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides an #include cleanup tool that improves the quality of your code in the following ways: -- Identifies unused headers and offers suggestions to remove them--which improves your build times. -- Add headers for code that is only working because the header for it is indirectly included by another headers. This reduces the brittleness of your code with respect to what files you # #include. - -This article shows explains what the #include cleanup tool in Visual Studio can do for you. +Starting with Visual Studio 17.7 preview 3, Visual Studio has an #include cleanup tool that improves the quality of your code in the following ways: +- Identifies unused header files in your code and offers to remove them--which improves your build times. +- Add headers for code that is only working because the header file for it is indirectly included by another header file. This reduces the brittleness of your code because your code doesn't rely on hidden dependencies in other header files. + +This article provides an overview of what the #include cleanup tool in Visual Studio can do. + +## Configure #include cleanup + +To configure the #include cleanup tool, go to **Tools** > **Options** > **C/C++** > **Intellisense** and select **Enable #include cleanup**. + +:::image type="content" source="media/vs2022_include_cleanup_option.png" alt-text="The Tools options dialog for C/C++ > Intellisense. The area in focus is the Enable # include cleanup checkbox and a dropdown for Remove unused includes tags and Add missing includes tags with the values Refactoring only, dimmed, warning, error, and suggestion."::: + +Use the following options to configure how you'd like to be notified about unused headers and for adding missing headers: + +**Refactoring only** +The cleanup tool will only offer to remove unused headers when you invoke refactoring by hovering the cursor over the include to bring up the light bulb. You can also press Ctrl+period while the cursor is in the #include to bring up the refactoring lightbulb: + +:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a lightbulb appears with the text that # include iostream is not used in this file."::: + +**Suggestion, Warning, Error** +The #include cleanup tool will offer to remove unused headers and show a suggestion, warning, or error in the Error List window. + +**Dimmed** +The #include cleanup tool will offer to remove unused header by dimming #include in the code editor. Hover your cursor over the dimmed #include to bring up the refactoring options to remove the unused header. + + ## Direct vs Indirect headers -First, some terminology. Direct headers are headers that you explicitly #include in your code. Indirect headers are headers that are included by other headers. Here's an example: +First, some terminology. Direct headers are headers that you explicitly #include in your code because you use something from them. Indirect headers are headers that are included by other headers that you may inadvertently take a dependency on. Here's an example: -File: header1.h +File: header.h ```cpp -// header1.h +// header.h #include -void test() { std::cout << "test";} +void test() { std::cout << "test";} // uses std::cout from , which we include, so is a direct header ``` File: source.cpp + ```cpp -#include "header1.h" +#include "header.h" // you should explicitly #include because you're using std::cout in this file test(); // outputs "test" -std::cout << "Only works because header1.h includes "; // you should explicitly #include rather than rely on header1.h to include it +std::cout << "Only works because header1.h includes "; // is an indirect header because you rely on rely on header1.h to provide it ``` -In this example, if `header1.h` is updated to no longer include ``, your code will break in `source.cpp`. Per the C++ guidelines, it's better to explicitly `#include ` in `source.cpp` so that your code isn't subject to brittleness caused by changes to header files. For more information about the guideline to avoid dependencies on names brought in implicitly when #including a header, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix these issues like this. +In this example, if `header1.h` is updated to no longer include ``, your code will break in `source.cpp` because it doesn't directly include a dependency it needs. It was relying on `header1.h` to provide it. Per the C++ guidelines, it's better to explicitly `#include ` in `source.cpp` so that your code isn't subject to brittleness caused by changes to header files. For more information about the guideline to avoid dependencies on names brought in implicitly when #including a header, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix these issues like this. ## Unused headers -As your code evolves, you may no longer need some headers. This is particularly hard to track in complex projects with many files. The C++ include cleanup tool helps you find and remove these unused headers. For example: +As your code evolves, you may no longer need some header files. This is hard to track in complex projects and over time your build time may be impacted by the compiler processing header files that aren't needed. The C++ include cleanup tool helps you find and remove these unused headers. For example: ```cpp - #include #include int main() { int x = std::rand(); // std::rand is defined in - std::cout << "x is: " << x; - int r = std::rand + // std::cout << "x is: " << x; // we no longer output x, so we don't need } ``` diff --git a/docs/ide/media/include-cleanup-refactor-lightbulb.png b/docs/ide/media/include-cleanup-refactor-lightbulb.png new file mode 100644 index 0000000000000000000000000000000000000000..358f3056b43dd8fce9f3771d0436a1c5dc891aae GIT binary patch literal 31436 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 literal 0 HcmV?d00001 diff --git a/docs/ide/media/vs2022_include_cleanup_option.png b/docs/ide/media/vs2022_include_cleanup_option.png new file mode 100644 index 0000000000000000000000000000000000000000..daf9dc54955b1bb2cd4dfac44460c5e2d5828c70 GIT binary patch literal 83722 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 literal 0 HcmV?d00001 diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index fcb8b911f3..bf61648091 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -9,7 +9,7 @@ items: - name: Navigate C++ code href: ../ide/navigate-code-cpp.md - name: Include cleanup - href: ../ide/include-cleanup.md + href: ../ide/include-cleanup-overview.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md - name: Collaborate using Live Share for C++ From 484d334e02223dbae525ac7ba722a4a8f9a460b6 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Tue, 12 Sep 2023 09:15:06 -0700 Subject: [PATCH 0114/1931] Update build-reliable-secure-programs.md --- docs/code-quality/build-reliable-secure-programs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index ac58704e1e..7911df7550 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -1,11 +1,11 @@ --- -description: "Learn more about: Building reliable and secure programs by applying NISTIR 8397 guidelines." -title: Build reliable and secure programs +description: "Learn more about: Building reliable and secure C++ programs by applying NISTIR 8397 guidelines." +title: Build reliable and secure C++ programs ms.date: 09/07/2023 ms.topic: "conceptual" --- -# Build reliable and secure programs +# Build reliable and secure C++ programs The United States government publication [NISTIR 8397: Guidelines on Minimum Standards for Developer Verification of Software](https://nvlpubs.nist.gov/nistpubs/ir/2021/NIST.IR.8397.pdf) contains excellent guidance on how to build reliable and secure software in any programming language. From 613934ef6e18f238da0673ac98d67ef142372246 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Tue, 12 Sep 2023 09:21:05 -0700 Subject: [PATCH 0115/1931] Final(?) pass over Acrolinx diagnostics --- docs/code-quality/build-reliable-secure-programs.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 7911df7550..0e650d3cb2 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -127,7 +127,7 @@ Notes: - `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable finding uninitialized data errors that other static analysis tools can't check, because the errors only become visible after the compiler back-end performs interprocedural analysis and inlining. - BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates PDBs and other outputs that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Issues reported as "warnings" should be evaluated selectively, because resolving them can have performance implications or may not be necessary. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Run source code analysis immediately on the local developer's machine, or at least for every commit or pull request. This helps to catch source bugs as early as possible and minimize overall costs. Binary level bugs tend to be introduced more slowly, so it may be sufficient to run binary analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds). +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Run source code analysis immediately on the local developer's machine, or at least for every commit or pull request, to catch source bugs as early as possible and minimize overall costs. Binary level bugs tend to be introduced more slowly, so it may be sufficient to run binary analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds). ## 2.4 Review for hardcoded secrets @@ -302,7 +302,7 @@ Run these tests regularly, and compare the results to previous runs to catch bre **Crash dumps** -These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import the dumps directly into Visual Studio to further investigate what parts of the code are hitting these issues. Running functional tests from within Visual Studio makes it easy to replicate and debug failures, by letting you see into the black box to exactly where the test fails and by letting you test code changes quickly. +These tests help find issues with reliability, being able to test many different scenarios that may run into crashes, hangs, deadlocks, and so on. By collecting crash dumps as part of test failures, you can import the dumps directly into Visual Studio to further investigate what parts of the code are hitting these issues. If you run functional tests from within Visual Studio, you can easily replicate and debug failures by seeing exactly where inside the black box the test fails, and you can test fixes quickly. To get started with debugging tests, see [Debug unit tests with Test Explorer - Visual Studio (Windows)](/visualstudio/test/debug-unit-tests-with-test-explorer) @@ -361,7 +361,11 @@ Since they test for bug regressions, these tests should be quick and easy to run **Visual Studio** -Visual Studio lets you easily add tests to the suite while making the changes to fix the bug, and quickly run the tests and code coverage to ensure all new cases get considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. You can use Azure DevOps boards and test plans together with Visual Studio to associate tests, test cases, and issues, and track of all aspects of an issue and its corresponding tests. For more information, see: +Visual Studio lets you easily add tests to the suite while making the changes to fix the bug, and quickly run the tests and code coverage to ensure all new cases get considered. Referencing the bug ID from your issue tracking system in your code where you write the test is a good way to connect regression tests to the corresponding issues. Prefer to use Azure DevOps boards and test plans together with Visual Studio: +- to associate tests, test cases, and issues; and +- to track of all aspects of an issue and its corresponding tests. + +For more information, see: - [Associate automated tests with test cases - Azure Test Plans](/azure/devops/test/associate-automated-test-with-test-case) - [Link work items to other objects - Azure DevOps](/azure/devops/organizations/notifications/add-links-to-work-items) From c4627d761d91f63b33c14c5625db59b1209e3db8 Mon Sep 17 00:00:00 2001 From: Amy Wishnousky Date: Tue, 12 Sep 2023 15:15:24 -0700 Subject: [PATCH 0116/1931] Update asan-runtime.md with ASan one-dll changes Update lib information for VS 17.7p3 as described in https://devblogs.microsoft.com/cppblog/msvc-address-sanitizer-one-dll-for-all-runtime-configurations/ --- docs/sanitizers/asan-runtime.md | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/docs/sanitizers/asan-runtime.md b/docs/sanitizers/asan-runtime.md index aef0c9e5f1..92a0fc859e 100644 --- a/docs/sanitizers/asan-runtime.md +++ b/docs/sanitizers/asan-runtime.md @@ -9,22 +9,32 @@ helpviewer_keywords: ["AddressSanitizer runtime", "Address Sanitizer runtime", " The AddressSanitizer runtime library intercepts common memory allocation functions and operations to enable inspection of memory accesses. There are several different runtime libraries that support the various types of executables the compiler may generate. The compiler and linker automatically link the appropriate runtime libraries, as long as you pass the [`/fsanitize=address`](../build/reference/fsanitize.md) option at compile time. You can override the default behavior by using the **`/NODEFAULTLIB`** option at link time. For more information, see the section on [linking](./asan-building.md#linker) in the [AddressSanitizer language, build, and debugging reference](./asan-building.md). -Below is an inventory of runtime libraries for linking to the AddressSanitizer runtime, where *`{arch}`* is either *`i386`* or *`x86_64`*. +Below is an inventory of runtime libraries for linking to the AddressSanitizer runtime, where *`{arch}`* is either *`i386`* or *`x86_64`*, as of Visual Studio 17.7 Preview 3. > [!NOTE] > These libraries keep the Clang conventions for architecture names. The MSVC conventions are normally x86 and x64 rather than i386 and x86_64. They refer to the same architectures. +> -| CRT option | DLL or EXE | DEBUG? | AddressSanitizer runtime binaries libraries | -|--|--|--|--| -| MT | EXE | NO | *`clang_rt.asan-{arch}`*, *`clang_rt.asan_cxx-{arch}`* | -| MT | DLL | NO | *`clang_rt.asan_dll_thunk-{arch}`* | -| MD | EITHER | NO | *`clang_rt.asan_dynamic-{arch}`*, *`clang_rt.asan_dynamic_runtime_thunk-{arch}`* | -| MT | EXE | YES | *`clang_rt.asan_dbg-{arch}`*, *`clang_rt.asan_dbg_cxx-{arch}`* | -| MT | DLL | YES | *`clang_rt.asan_dbg_dll_thunk-{arch}`* | -| MD | EITHER | YES | *`clang_rt.asan_dbg_dynamic-{arch}`*, *`clang_rt.asan_dbg_dynamic_runtime_thunk-{arch}`* | +| CRT option | AddressSanitizer runtime library (.lib) | Address runtime binary (.dll) +|--|--|--| +| MT or MTd | *`clang_rt.asan_dynamic-{arch}`*, *`clang_rt.asan_static_runtime_thunk-{arch}`* | *`clang_rt.asan_dynamic-{arch}`* +| MD or MDd | *`clang_rt.asan_dynamic-{arch}`*, *`clang_rt.asan_dynamic_runtime_thunk-{arch}`* | *`clang_rt.asan_dynamic-{arch}`* When compiling with `cl /fsanitize=address`, the compiler generates instructions to manage and check the [shadow bytes](./asan-shadow-bytes.md). Your program uses this instrumentation to check memory accesses on the stack, in the heap, or in the global scope. The compiler also produces metadata describing stack and global variables. This metadata enables the runtime to generate precise error diagnostics: function names, lines, and columns in your source code. Combined, the compiler checks and runtime libraries can precisely diagnose many types of [memory safety bugs](./asan-error-examples.md) if they're encountered at run-time. +### Previous versions + +Prior to Visual Studio 17.7 Preview 3, statically linked (**`/MT`** or **`/MTd`**) builds did not use a DLL dependency and instead fully statically linked in the AddressSanitizer runtime into the user's EXE. DLL projects would then load exports from the user's EXE to access ASan functionality. Additionally, dynamically linked projects (**`/MD`** or **`/MTd`**) used different libraries and DLLs depending on whether the project was configured for debug or release. These changes and their motivations are discussed further on the MSVC Blog: [MSVC Address Sanitizer – One DLL for all Runtime Configurations](https://devblogs.microsoft.com/cppblog/msvc-address-sanitizer-one-dll-for-all-runtime-configurations/). + +| CRT option | DLL or EXE | DEBUG? | AddressSanitizer runtime binaries libraries | Address runtime binary (.dll) +|--|--|--|--|--| +| MT | EXE | No | *`clang_rt.asan-{arch}`*, *`clang_rt.asan_cxx-{arch}`* | None +| MT | DLL | No | *`clang_rt.asan_dll_thunk-{arch}`* | None +| MD | Either | No | *`clang_rt.asan_dynamic-{arch}`*, *`clang_rt.asan_dynamic_runtime_thunk-{arch}`* | *`clang_rt.asan_dynamic-{arch}`* +| MT | EXE | Yes | *`clang_rt.asan_dbg-{arch}`*, *`clang_rt.asan_dbg_cxx-{arch}`* | None +| MT | DLL | Yes | *`clang_rt.asan_dbg_dll_thunk-{arch}`* | None +| MD | Either | Yes | *`clang_rt.asan_dbg_dynamic-{arch}`*, *`clang_rt.asan_dbg_dynamic_runtime_thunk-{arch}`* | *`clang_rt.asan_dbg_dynamic-{arch}`* + ## Function interception The AddressSanitizer achieves function interception through many hot-patching techniques. These techniques are [best documented within the source code itself](https://github.com/llvm/llvm-project/blob/1a2eaebc09c6a200f93b8beb37130c8b8aab3934/compiler-rt/lib/interception/interception_win.cpp#L11). From 5171d2bcdfe9fa0c58701733f64bf58fcb6cd512 Mon Sep 17 00:00:00 2001 From: Michael Howard Date: Wed, 13 Sep 2023 08:27:57 -0500 Subject: [PATCH 0117/1931] Update build-reliable-secure-programs.md Michael Howard edits --- .../build-reliable-secure-programs.md | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 0e650d3cb2..5f8c8936ec 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -17,15 +17,15 @@ This document follows the same structure as NISTIR 8397. Each section: **Summary** -Threat modeling is valuable, especially when applied in a way that scales to meet your development needs and that reduces noise. +Threat modeling is a valuable process, especially when applied in a way that scales to meet your development needs and that reduces noise. **Recommendations** Threat modeling should be one part of your dynamic Security Development Lifecycle (SDL). We suggest that for your product as a whole, for a specific feature, or for a major design or implementation change: 1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. -1. Apply threat modeling in a targeted way. Don't apply threat modeling to all features, but tactically to complex or critical features. Do apply it regularly instead as part of a top-down product review. -1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are done later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After you create a baseline threat model, plan to continue iterating on it as the attack surface changes. +1. Apply threat modeling in a targeted way. Apply threat modeling to all features, but tactically start with exposed, complex or critical features. Do apply it regularly instead as part of a top-down product review. +1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are created later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After you create a baseline threat model, plan to continue iterating on it as the attack surface changes. 1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This approach enables better automated risk assessment and focusing of security efforts on the specific components or features that change. 1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) @@ -35,7 +35,7 @@ To properly apply threat modeling and avoid underuse/overuse, we have found that *Development approach* -First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change has a threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: +First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change requir an update to the threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: - Does the feature make a major change in design of how we provide customer isolation in a multi-tenant environment? If so, consider performing a full threat model. - Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. - Is this change primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. @@ -51,7 +51,7 @@ Second, maintain a strong asset inventory of the products you're tasked with ass - machine learning in the cloud feeding back into the device or a fleet management application, - and more. -In such complex products, it's not effective to require traditional SDL modeling of each functional unit in isolation. Having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. +In such complex products, threat modeling is critical and having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. *Granularity and integration* @@ -109,7 +109,7 @@ Tests that do deeper verification and take longer to run, such as static analysi - Enable static analysis for all C++ programs, for both the input source code (before compilation) and the executable binaries (after compilation). "Enable" might mean to run analysis during each build on the developer's machine, or as a separate build to inspect the code later or as a checkin requirement. - Incorporate static analysis into CI pipelines as a form of testing. - Static analysis by definition comes with false positives, and be prepared to incorporate that fact into your quality feedback loop. Be quick to enable all low-false-positive warnings up front. Then be proactive to gradually increase the number of rules for which your code base compiles warning-clean as you regularly add more rules that flag important bugs at the expense of gradually higher false positives (initially, before the code base has been cleaned for those rules too). -- Always use the latest supported versions of Visual Studio, and set up your engineering environment to be able to quickly consume the latest patch releases as soon as they become available, without delaying to the next development stage/cycle. +- Always use the latest supported versions of Visual Studio, and set up your engineering environment to quickly consume the latest patch releases as soon as they become available, without delaying to the next development stage/cycle. **Key tools** Be aware of and use the following: @@ -172,16 +172,13 @@ When credentials are found in your source code, the immediate urgent need is to 1. Invalidate the exposed secret. 1. Perform auditing/risk assessment of potential damage due to compromise. -To safeguard cryptographic keys and other secrets used by cloud apps and services, use [Azure Key Vault](https://azure.microsoft.com/products/key-vault). +To safeguard cryptographic keys and other secrets used by cloud apps and services, use [Azure Key Vault](https://azure.microsoft.com/products/key-vault) with an appropriate access policy. If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: -- [dMSI: dSTS managed service identity](https://accessmanagementdocs.azurewebsites.net/dsts/advanced/dMSISupportDetails.html) - [Azure AD: Implementing autorotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) -- [dKDS: Datacenter key distribution service](https://msazure.visualstudio.com/AzureCoreSecurityServices/_wiki/wikis/AzureCoreSecurityServices.wiki/20522/Key-Distribution-Service-(dKDS)) -- [Key Vault & dSMS & Secrets Management: What is certificate autorotation?](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/getstartedcerts#how-do-i-procure-and-store-the-cert) **Azure DevOps (AzDO)** @@ -264,7 +261,7 @@ Compilation should enable security-relevant compiler checks as breaking errors, **Mark binaries as compatible with OS runtime security mitigations** -Compiler settings should opt into code generation features that detect and mitigate malicious code execution, including: +Compiler and linker settings should opt into code generation features that detect and mitigate malicious code execution, including: - Stack corruption prevention - [`/SAFESEH` - Image has safe exception handlers](https://aka.ms/SafeExceptionHandlers) - Produces a table of the image's safe exception handlers for x86 binaries. - [`/GS` - Buffer Security Check](https://aka.ms/BufferSecurityCheck) - Detects some buffer overruns that overwrite return addresses, exception handler addresses or certain types of parameters. @@ -407,7 +404,7 @@ Modify your build(s) to support continuous creation of executables that use LibF Within the scope of Microsoft Visual C++ on Windows, Microsoft recommends: - Prefer TypeScript, JavaScript, and ASP.NET for web applications. -- Don't write web extensions in C++. Microsoft has banned using ActiveX. +- Don't write web extensions in C++. Microsoft has deprecated ActiveX. - When code is compiled to Emscripten/WASM, it's no longer C++ and other tools apply. - Microsoft provides [RESTler, a stateful REST API fuzzer](https://github.com/microsoft/restler-fuzzer). From 928ea8cd9dd818a6f309d8befac74acce81a5048 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Wed, 13 Sep 2023 08:55:04 -0700 Subject: [PATCH 0118/1931] Fix typo --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 5f8c8936ec..1544af325c 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -35,7 +35,7 @@ To properly apply threat modeling and avoid underuse/overuse, we have found that *Development approach* -First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change requir an update to the threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: +First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change require an update to the threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: - Does the feature make a major change in design of how we provide customer isolation in a multi-tenant environment? If so, consider performing a full threat model. - Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. - Is this change primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. From 13d303cb1181af4b15bf75af85213086a9807221 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Wed, 13 Sep 2023 09:11:31 -0700 Subject: [PATCH 0119/1931] Removed dangling references to dMSI and dKDS --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 1544af325c..74ceb54aa2 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -176,7 +176,7 @@ To safeguard cryptographic keys and other secrets used by cloud apps and service If an exposure compromises certain customer data/PII, it may require other compliance/reporting requirements. -Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like dMSI, Azure AD, or dKDS. You can update your authentication methods to take advantage of managed identities via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: +Remove the now-invalidated secrets from your source code, and replace them with alternative methods that don't expose the secrets directly in your source code. Look for opportunities to eliminate secrets where possible by using tools like Azure AD. You can update your authentication methods to take advantage of managed identities via Azure Active Directory (AAD). Only use approved stores to store and manage secrets such as Azure Key Vault (AKV). For more information, see: - [Azure AD: Implementing autorotation using Azure Active Directory (AAD)](https://eng.ms/docs/products/onecert-certificates-key-vault-and-dsms/key-vault-dsms/autorotationandecr/scenarios/aad) From d79e95214f80d347211e7b3134b6e485105f59ae Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Wed, 13 Sep 2023 14:37:31 -0700 Subject: [PATCH 0120/1931] Removed mentions of LSan --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 74ceb54aa2..3e34f90ca4 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -383,7 +383,7 @@ When fuzzing reports a failure, it always naturally provides a reproducible test When using both sanitizers such as [Address Sanitizer (ASan)](../sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan and LSan. When compiled for ASan and LSan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html); if you enable ASan, LibFuzzer is enabled automatically. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan. When compiled for ASan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html); if you enable ASan, LibFuzzer is enabled automatically. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** From 67d7a871a28458b8fc52572a52e0c2a4a4b611aa Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 14 Sep 2023 10:50:44 -0700 Subject: [PATCH 0121/1931] fix code error --- docs/cpp/decltype-cpp.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/cpp/decltype-cpp.md b/docs/cpp/decltype-cpp.md index 560e1a162e..2b387820ce 100644 --- a/docs/cpp/decltype-cpp.md +++ b/docs/cpp/decltype-cpp.md @@ -1,10 +1,9 @@ --- description: "Learn more about: decltype (C++)" title: "decltype (C++)" -ms.date: 09/27/2022 +ms.date: 09/14/2023 f1_keywords: ["decltype_cpp"] helpviewer_keywords: ["operators [C++], decltype", "decltype operator", "operators [C++], type of an expression", "operators [C++], deduce expression type"] -ms.assetid: 6dcf8888-8196-4f13-af50-51e3797255d4 --- # `decltype` (C++) @@ -40,7 +39,7 @@ The following code example demonstrates some uses of the **`decltype`** type spe ```cpp int var; const int&& fx(); -struct A { double x; } +struct A { double x; }; const A* a = new A(); ``` From 38c734552c030ae923d4a6e2459cc5ed8db5f8f7 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 14 Sep 2023 11:31:16 -0700 Subject: [PATCH 0122/1931] fix github4706-add reference to init function --- docs/c-runtime-library/crt-initialization.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/c-runtime-library/crt-initialization.md b/docs/c-runtime-library/crt-initialization.md index 705348bd86..b2971c1be1 100644 --- a/docs/c-runtime-library/crt-initialization.md +++ b/docs/c-runtime-library/crt-initialization.md @@ -4,7 +4,6 @@ description: "Describes how the CRT initializes global state in native code." ms.topic: "conceptual" ms.date: 08/02/2021 helpviewer_keywords: ["CRT initialization [C++]"] -ms.assetid: e7979813-1856-4848-9639-f29c86b74ad7 --- # CRT initialization @@ -16,9 +15,9 @@ It's possible, though not recommended, to take advantage of Microsoft-specific l ## Initializing a global object -Consider the following code: +Consider the following C++ code (C won't allow this code because it doesn't allow a function call in a constant expression). -```C +```cpp int func(void) { return 3; @@ -69,7 +68,6 @@ Offset Type Applied To Index Name The CRT defines two pointers: - `__xc_a` in `.CRT$XCA` - - `__xc_z` in `.CRT$XCZ` Neither group has any other symbols defined except `__xc_a` and `__xc_z`. @@ -88,7 +86,7 @@ The section should resemble this example: __xc_z ``` -So, the CRT library uses both `__xc_a` and `__xc_z` to determine the start and end of the global initializers list because of the way in which they're laid out in memory after the image is loaded. +The CRT library uses both `__xc_a` and `__xc_z` to determine the start and end of the global initializers list because of the way in which they're laid out in memory after the image is loaded. ## Linker features for initialization @@ -112,4 +110,5 @@ The names `.CRT$XCT` and `.CRT$XCV` aren't used by either the compiler or the CR ## See also +[`_initterm, _initterm_e`](./reference/initterm-initterm-e.md)\ [C runtime (CRT) and C++ Standard Library (STL) `.lib` files](./crt-library-features.md) From 082335e27b4933760c8cca2a61d95316c10d5d34 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 14 Sep 2023 11:43:06 -0700 Subject: [PATCH 0123/1931] add a fix for github 4688 - __fastcall parameter passing clarification --- docs/cpp/fastcall.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/cpp/fastcall.md b/docs/cpp/fastcall.md index bae76403db..28d3ab39e3 100644 --- a/docs/cpp/fastcall.md +++ b/docs/cpp/fastcall.md @@ -1,10 +1,9 @@ --- description: "Learn more about: __fastcall" title: "__fastcall" -ms.date: "12/17/2018" +ms.date: 09/14/2023 f1_keywords: ["__fastcall_cpp", "__fastcall", "_fastcall"] helpviewer_keywords: ["__fastcall keyword [C++]"] -ms.assetid: bb5b9c8a-dfad-450c-9119-0ac2bc59544f --- # __fastcall @@ -14,10 +13,12 @@ The **`__fastcall`** calling convention specifies that arguments to functions ar |Element|Implementation| |-------------|--------------------| -|Argument-passing order|The first two DWORD or smaller arguments that are found in the argument list from left to right are passed in ECX and EDX registers; all other arguments are passed on the stack from right to left.| +|Argument-passing order|The first two `DWORD` or smaller arguments that are found in the argument list from left to right are passed in ECX and EDX registers; all other arguments are passed on the stack from right to left.| |Stack-maintenance responsibility|Called function pops the arguments from the stack.| |Name-decoration convention|At sign (\@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names.| |Case-translation convention|No case translation performed.| +|Classes, structs, and unions|Treated as "multibyte" types (regardless of size) and passed on the stack. | +|Enums and enum classes | Passed by register if their underlying type would be passed by register. For example, if the underlying type is `int` or `unsigned int` of size 8, 16, or 32 bits. | > [!NOTE] > Future compiler versions may use different registers to store parameters. @@ -46,7 +47,7 @@ is equivalent to this: void __fastcall CMyClass::mymethod() { return; } ``` -For compatibility with previous versions, **_fastcall** is a synonym for **`__fastcall`** unless compiler option [/Za \(Disable language extensions)](../build/reference/za-ze-disable-language-extensions.md) is specified. +For compatibility with previous versions, **`_fastcall`** is a synonym for **`__fastcall`** unless compiler option [/Za \(Disable language extensions)](../build/reference/za-ze-disable-language-extensions.md) is specified. ## Example From 73c8e3005307e304078610032a29f5ac06dc36da Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 14 Sep 2023 11:58:23 -0700 Subject: [PATCH 0124/1931] acrolinx --- docs/cpp/fastcall.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/cpp/fastcall.md b/docs/cpp/fastcall.md index 28d3ab39e3..772adbead2 100644 --- a/docs/cpp/fastcall.md +++ b/docs/cpp/fastcall.md @@ -18,7 +18,7 @@ The **`__fastcall`** calling convention specifies that arguments to functions ar |Name-decoration convention|At sign (\@) is prefixed to names; an at sign followed by the number of bytes (in decimal) in the parameter list is suffixed to names.| |Case-translation convention|No case translation performed.| |Classes, structs, and unions|Treated as "multibyte" types (regardless of size) and passed on the stack. | -|Enums and enum classes | Passed by register if their underlying type would be passed by register. For example, if the underlying type is `int` or `unsigned int` of size 8, 16, or 32 bits. | +|Enums and enum classes | Passed by register if their underlying type is passed by register. For example, if the underlying type is `int` or `unsigned int` of size 8, 16, or 32 bits. | > [!NOTE] > Future compiler versions may use different registers to store parameters. @@ -27,7 +27,7 @@ Using the [/Gr](../build/reference/gd-gr-gv-gz-calling-convention.md) compiler o The **`__fastcall`** keyword is accepted and ignored by the compilers that target ARM and x64 architectures; on an x64 chip, by convention, the first four arguments are passed in registers when possible, and additional arguments are passed on the stack. For more information, see [x64 Calling Convention](../build/x64-calling-convention.md). On an ARM chip, up to four integer arguments and eight floating-point arguments may be passed in registers, and additional arguments are passed on the stack. -For non-static class functions, if the function is defined out-of-line, the calling convention modifier does not have to be specified on the out-of-line definition. That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. Given this class definition: +For nonstatic class functions, if the function is defined out-of-line, the calling convention modifier doesn't have to be specified on the out-of-line definition. That is, for class non-static member methods, the calling convention specified during declaration is assumed at the point of definition. Given this class definition: ```cpp struct CMyClass { From 0d0d9a8b7181df35cdaf82cdbf9783ff5d74b1dc Mon Sep 17 00:00:00 2001 From: Tyler Whitney Date: Fri, 15 Sep 2023 11:10:59 -0700 Subject: [PATCH 0125/1931] update date --- docs/sanitizers/asan-runtime.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/sanitizers/asan-runtime.md b/docs/sanitizers/asan-runtime.md index 92a0fc859e..c1f7248ac3 100644 --- a/docs/sanitizers/asan-runtime.md +++ b/docs/sanitizers/asan-runtime.md @@ -1,7 +1,7 @@ --- title: "AddressSanitizer runtime" description: "Technical description of the AddressSanitizer runtime for Microsoft C/C++." -ms.date: 03/02/2021 +ms.date: 09/14/2023 helpviewer_keywords: ["AddressSanitizer runtime", "Address Sanitizer runtime", "clang_rt.asan", "Clang runtime", "Asan runtime"] --- From 5508564507ff2dc3b4d08c6d436e08ba832202e6 Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Mon, 18 Sep 2023 14:57:37 -0700 Subject: [PATCH 0126/1931] Change to bullet list per PR merge feedback --- docs/code-quality/build-reliable-secure-programs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 3e34f90ca4..8e64595d9a 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -23,11 +23,11 @@ Threat modeling is a valuable process, especially when applied in a way that sca Threat modeling should be one part of your dynamic Security Development Lifecycle (SDL). We suggest that for your product as a whole, for a specific feature, or for a major design or implementation change: -1. Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. -1. Apply threat modeling in a targeted way. Apply threat modeling to all features, but tactically start with exposed, complex or critical features. Do apply it regularly instead as part of a top-down product review. -1. Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are created later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After you create a baseline threat model, plan to continue iterating on it as the attack surface changes. -1. Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This approach enables better automated risk assessment and focusing of security efforts on the specific components or features that change. -1. **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) +- Have a solid, dynamic SDL that allows for early engagement with developer teams and rightsizing of approach. +- Apply threat modeling in a targeted way. Apply threat modeling to all features, but tactically start with exposed, complex or critical features. Do apply it regularly instead as part of a top-down product review. +- Apply threat modeling early (as with all security requirements), when there's still opportunity to change the design. Also, threat models serve as an input to other processes, such as attack surface reduction or designing for security. Threat models that are created later are at best "surveys" for pen test (penetration testing) or areas that need security testing such as fuzzing. After you create a baseline threat model, plan to continue iterating on it as the attack surface changes. +- Use asset inventory and compliance to appropriately track what makes up a product, and track security artifacts (including threat models) along with the assets they apply to. This approach enables better automated risk assessment and focusing of security efforts on the specific components or features that change. +- **In Azure**, the Microsoft Threat Modeling Tool was updated in 2022 for Azure development. For more information, see [Microsoft Threat Modeling Tool overview - Azure](/azure/security/develop/threat-modeling-tool) **Supporting factors and practices** From 3097417fd69b3855b05442864d641e18c620026d Mon Sep 17 00:00:00 2001 From: Herb Sutter Date: Mon, 18 Sep 2023 15:12:06 -0700 Subject: [PATCH 0127/1931] Address a few last Acrolinx style suggestions --- docs/code-quality/build-reliable-secure-programs.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 8e64595d9a..b2395846a6 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -35,7 +35,7 @@ To properly apply threat modeling and avoid underuse/overuse, we have found that *Development approach* -First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require that every functional change require an update to the threat model. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: +First, understand the team's development approach. For teams with agile development workflows that push dozens of changes to production daily, it's not practical or reasonable to require a threat model update for every functional change. Instead, from the start when writing a feature's functional requirements, consider including a security requirements questionnaire. The questionnaire should focus on specific questions about the feature to determine what future aspects of your SDL apply. For example: - Does the feature make a major change in design of how we provide customer isolation in a multi-tenant environment? If so, consider performing a full threat model. - Does a new feature allow file uploads? If so, perhaps what's more appropriate is a web application security assessment. - Is this change primarily just a functional UI change? If so, perhaps nothing is needed beyond your traditional automated tooling. @@ -51,7 +51,7 @@ Second, maintain a strong asset inventory of the products you're tasked with ass - machine learning in the cloud feeding back into the device or a fleet management application, - and more. -In such complex products, threat modeling is critical and having a strong asset inventory enables you to view the entirely of the product stack to see the complete picture, and see the key points that need to evaluate how a new/changed feature impacts product security. +In such complex products, threat modeling is critical. Having a strong asset inventory lets you view the entire product stack to see the complete picture, and to see the key places that need to be evaluated for how a new or changed feature impacts product security. *Granularity and integration* @@ -127,7 +127,7 @@ Notes: - `/W4` and `/WX` should be enabled wherever possible, to ensure you compile your code cleanly at high warning levels (`W4`) and treat warnings as errors that must be fixed (`WX`). These options enable finding uninitialized data errors that other static analysis tools can't check, because the errors only become visible after the compiler back-end performs interprocedural analysis and inlining. - BinSkim binary analysis ensures that projects enable a broad range of security features. BinSkim generates PDBs and other outputs that make it easier to verify chain-of-custody and to respond efficiently to security issues. Microsoft recommends running the BinSkim tool to analyze all executable binaries (`.sys`, `.dll` or `.exe`) produced for or consumed by your programs. The BinSkim User Guide includes a list of supported security standards. Microsoft recommends that you fix all issues reported as "errors" by the BinSkim tool. Issues reported as "warnings" should be evaluated selectively, because resolving them can have performance implications or may not be necessary. -**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Run source code analysis immediately on the local developer's machine, or at least for every commit or pull request, to catch source bugs as early as possible and minimize overall costs. Binary level bugs tend to be introduced more slowly, so it may be sufficient to run binary analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds). +**In Azure and GitHub CI/CD** Microsoft recommends always enabling source code and binary static analysis in release CI/CD scenarios. Run source analysis immediately on the local developer's machine, or at least for every commit or pull request, to catch source bugs as early as possible and minimize overall costs. Binary level bugs tend to be introduced more slowly, so it may be sufficient to run binary analysis in less frequent prerelease CI/CD scenarios (such as nightly or weekly builds). ## 2.4 Review for hardcoded secrets From d77f2302dd16fc8022f1e93207e78c0fb6ddadbb Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 20 Sep 2023 12:44:48 -0700 Subject: [PATCH 0128/1931] draft --- docs/ide/include-cleanup-overview.md | 34 +++++++++++++--------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 0682a59aeb..aab47cf2ca 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -1,42 +1,40 @@ --- -title: "Cleanup #includes in C++ code in Visual Studio" +title: "Cleanup C++ #includes in Visual Studio" description: "Learn about using the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." -ms.date: 09/15/2023 +ms.date: 09/21/2023 ms.topic: "overview" ms.custom: intro-overview --- -# Cleanup #includes in C++ code in Visual Studio +# Cleanup C++ #includes in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio has an #include cleanup tool that improves the quality of your code in the following ways: +Starting with Visual Studio 17.7 preview 3, Visual Studio has an `#include` cleanup tool that improves the quality of your code in the following ways: - Identifies unused header files in your code and offers to remove them--which improves your build times. - Add headers for code that is only working because the header file for it is indirectly included by another header file. This reduces the brittleness of your code because your code doesn't rely on hidden dependencies in other header files. -This article provides an overview of what the #include cleanup tool in Visual Studio can do. +This article provides an overview of what the `#include` cleanup tool in Visual Studio can do. ## Configure #include cleanup -To configure the #include cleanup tool, go to **Tools** > **Options** > **C/C++** > **Intellisense** and select **Enable #include cleanup**. +To configure the `#include` cleanup tool, go to **Tools** > **Options** > **C/C++** > **Intellisense** and select **Enable #include cleanup**. :::image type="content" source="media/vs2022_include_cleanup_option.png" alt-text="The Tools options dialog for C/C++ > Intellisense. The area in focus is the Enable # include cleanup checkbox and a dropdown for Remove unused includes tags and Add missing includes tags with the values Refactoring only, dimmed, warning, error, and suggestion."::: -Use the following options to configure how you'd like to be notified about unused headers and for adding missing headers: +Use the following options to configure how you want to be notified about unused headers and for adding missing headers: -**Refactoring only** -The cleanup tool will only offer to remove unused headers when you invoke refactoring by hovering the cursor over the include to bring up the light bulb. You can also press Ctrl+period while the cursor is in the #include to bring up the refactoring lightbulb: +**Refactoring only**\ +The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the lightbulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring lightbulb: :::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a lightbulb appears with the text that # include iostream is not used in this file."::: -**Suggestion, Warning, Error** -The #include cleanup tool will offer to remove unused headers and show a suggestion, warning, or error in the Error List window. +**Suggestion, Warning, Error**\ +The `#include` cleanup tool will offer to remove unused headers and show a suggestion, warning, or error in the Error List window. -**Dimmed** -The #include cleanup tool will offer to remove unused header by dimming #include in the code editor. Hover your cursor over the dimmed #include to bring up the refactoring options to remove the unused header. +**Dimmed**\ +The `#include` cleanup tool will offer to remove unused header by dimming `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header. +## Direct vs indirect headers - -## Direct vs Indirect headers - -First, some terminology. Direct headers are headers that you explicitly #include in your code because you use something from them. Indirect headers are headers that are included by other headers that you may inadvertently take a dependency on. Here's an example: +First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are headers included by a header you directly included. You can inadvertently take a dependency on the indirect header. Here's an example: File: header.h @@ -73,7 +71,7 @@ int main() } ``` -## See Also +## See also the walkthrough the reference \ No newline at end of file From 41665e2d480317704bf4090f16c8d048b6a6b133 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 20 Sep 2023 12:48:38 -0700 Subject: [PATCH 0129/1931] incorp review --- docs/code-quality/build-reliable-secure-programs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index b2395846a6..f5ac490c09 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -1,7 +1,7 @@ --- description: "Learn more about: Building reliable and secure C++ programs by applying NISTIR 8397 guidelines." title: Build reliable and secure C++ programs -ms.date: 09/07/2023 +ms.date: 09/20/2023 ms.topic: "conceptual" --- @@ -383,7 +383,7 @@ When fuzzing reports a failure, it always naturally provides a reproducible test When using both sanitizers such as [Address Sanitizer (ASan)](../sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan. When compiled for ASan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html); if you enable ASan, LibFuzzer is enabled automatically. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan. When compiled for ASan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html) which requires ASan to be enabled first. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** From 9a96311122acd6c6de1e2624cd0f95655fac6500 Mon Sep 17 00:00:00 2001 From: Jia Tan Date: Fri, 22 Sep 2023 01:56:15 +0800 Subject: [PATCH 0130/1931] Update C Runtime Library Compatibility page. (#4716) Fixes #4715 --- docs/c-runtime-library/compatibility.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/c-runtime-library/compatibility.md b/docs/c-runtime-library/compatibility.md index e1c99c1d61..45f753bf02 100644 --- a/docs/c-runtime-library/compatibility.md +++ b/docs/c-runtime-library/compatibility.md @@ -33,6 +33,6 @@ Except as noted within the documentation for specific functions, the UCRT is com | [UWP apps, the Windows Runtime, and the C runtime](./windows-store-apps-the-windows-runtime-and-the-c-run-time.md) | Describes when UCRT routines aren't compatible with Universal Windows apps or Microsoft Store apps. | | [ANSI C conformance](./ansi-c-compliance.md) | Describes standard-conforming names in the UCRT. | | [UNIX](./unix.md) | Provides guidelines for porting programs to UNIX. | -| [Windows platforms (CRT)](./windows-platforms-crt.md) | Lists the operating systems that are the CRT supports. | +| [Windows platforms (CRT)](./windows-platforms-crt.md) | Lists the operating systems that CRT supports. | | [Backward compatibility](./backward-compatibility.md) | Describes how to map old CRT names to the new ones. | | [C runtime (CRT) and C++ Standard Library (STL) `.lib` files](./crt-library-features.md) | Provides an overview of the CRT library (.lib) files and the associated compiler options. | From cb09e2d4b4060171dd524c8325935ec685e3ec7c Mon Sep 17 00:00:00 2001 From: lb90 Date: Fri, 22 Sep 2023 14:51:10 +0200 Subject: [PATCH 0131/1931] initterm_e takes PIFV arguments --- docs/c-runtime-library/reference/initterm-initterm-e.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/c-runtime-library/reference/initterm-initterm-e.md b/docs/c-runtime-library/reference/initterm-initterm-e.md index 27ef43bc02..3063706706 100644 --- a/docs/c-runtime-library/reference/initterm-initterm-e.md +++ b/docs/c-runtime-library/reference/initterm-initterm-e.md @@ -25,8 +25,8 @@ void __cdecl _initterm( ); int __cdecl _initterm_e( - PVFV *, - PVFV * + PIFV *, + PIFV * ); ``` From bd87d2ea82e99730dd224afff28b770226405caa Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Mon, 25 Sep 2023 21:49:19 +0800 Subject: [PATCH 0132/1931] Add example for C2129 --- .../compiler-errors-1/compiler-error-c2129.md | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2129.md b/docs/error-messages/compiler-errors-1/compiler-error-c2129.md index a6945a3fc5..bc65e65142 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2129.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2129.md @@ -13,3 +13,27 @@ static function 'function' declared but not defined A forward reference is made to a **`static`** function that is never defined. A **`static`** function must be defined within file scope. If the function is defined in another file, it must be declared **`extern`**. + +The following sample generates C2129: + +```cpp +// C2129.cpp +static void foo(); // C2129 + +int main() { + foo(); +} +``` + +Possible resolution: + +```cpp +// C2129b.cpp +static void foo(); + +int main() { + foo(); +} + +static void foo() {} +``` From 1d2dfc253e038c1a22b15916fbd26886c585dbf7 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Tue, 26 Sep 2023 02:53:19 +0800 Subject: [PATCH 0133/1931] Add example for C2049 (#4722) --- .../compiler-errors-1/compiler-error-c2049.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2049.md b/docs/error-messages/compiler-errors-1/compiler-error-c2049.md index f4e39b6902..cc707acda1 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2049.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2049.md @@ -12,3 +12,21 @@ helpviewer_keywords: ["C2049"] The **`inline`** keyword may be used on a namespace definition extension only if it was also used on the original namespace definition. To resolve this issue, make the use of the **`inline`** specifier consistent across all parts of the namespace. + +The following sample generates C2049: + +```cpp +// C2049.cpp +namespace ns {} + +inline namespace ns {} // C2049 +``` + +Possible resolution: + +```cpp +// C2049b.cpp +namespace ns {} + +namespace ns {} +``` From bb079296db70056d4483c8138d4e830e79cbc737 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Mon, 25 Sep 2023 14:25:24 -0700 Subject: [PATCH 0134/1931] draft --- docs/ide/include-cleanup-overview.md | 75 ++++++++++-------- .../include-cleanup-refactor-lightbulb.png | Bin 31436 -> 17208 bytes .../media/vs2022-include-cleanup-option.png | Bin 0 -> 35558 bytes ...s2022-include-cleanup-refactor-options.png | Bin 0 -> 13806 bytes .../media/vs2022_include_cleanup_option.png | Bin 83722 -> 0 bytes 5 files changed, 44 insertions(+), 31 deletions(-) create mode 100644 docs/ide/media/vs2022-include-cleanup-option.png create mode 100644 docs/ide/media/vs2022-include-cleanup-refactor-options.png delete mode 100644 docs/ide/media/vs2022_include_cleanup_option.png diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index aab47cf2ca..711be67884 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -7,70 +7,83 @@ ms.custom: intro-overview --- # Cleanup C++ #includes in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio has an `#include` cleanup tool that improves the quality of your code in the following ways: -- Identifies unused header files in your code and offers to remove them--which improves your build times. -- Add headers for code that is only working because the header file for it is indirectly included by another header file. This reduces the brittleness of your code because your code doesn't rely on hidden dependencies in other header files. +Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: +- Identifies unused header files--improving your build time. +- Add headers for code that is only working because the header file for it is indirectly included by another header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. -This article provides an overview of what the `#include` cleanup tool in Visual Studio can do. +This article provides an overview of the `#include` cleanup tool. ## Configure #include cleanup -To configure the `#include` cleanup tool, go to **Tools** > **Options** > **C/C++** > **Intellisense** and select **Enable #include cleanup**. +Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. -:::image type="content" source="media/vs2022_include_cleanup_option.png" alt-text="The Tools options dialog for C/C++ > Intellisense. The area in focus is the Enable # include cleanup checkbox and a dropdown for Remove unused includes tags and Add missing includes tags with the values Refactoring only, dimmed, warning, error, and suggestion."::: +Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers and add missing headers: -Use the following options to configure how you want to be notified about unused headers and for adding missing headers: +:::image type="content" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup. The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes tags and Add missing includes tags are shown. The contents of the dropdown are shown, which are: Refactoring only, Suggestion, Warning, and Error. The Remove unused includes tags dropdown offers the same contents but also adds dimmed."::: -**Refactoring only**\ +**Refactoring only:**\ The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the lightbulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring lightbulb: :::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a lightbulb appears with the text that # include iostream is not used in this file."::: -**Suggestion, Warning, Error**\ -The `#include` cleanup tool will offer to remove unused headers and show a suggestion, warning, or error in the Error List window. +**Suggestion, Warning, Error:**\ +The `#include` cleanup tool will offer to remove unused headers via a suggestion squiggle, or a warning or error in the Error List window. -**Dimmed**\ +**Dimmed:**\ The `#include` cleanup tool will offer to remove unused header by dimming `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header. -## Direct vs indirect headers - -First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are headers included by a header you directly included. You can inadvertently take a dependency on the indirect header. Here's an example: - -File: header.h +For the exercises in this article, Remove unused includes tags is set to **Dimmed** and add missing includes tags is set to **Refactoring only**. -```cpp -// header.h -#include -void test() { std::cout << "test";} // uses std::cout from , which we include, so is a direct header -``` +## Direct vs indirect headers -File: source.cpp +First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are included by a header you directly include. You can inadvertently take a dependency on the indirect header. Here's an example: ```cpp -#include "header.h" -// you should explicitly #include because you're using std::cout in this file +#include -test(); // outputs "test" -std::cout << "Only works because header1.h includes "; // is an indirect header because you rely on rely on header1.h to provide it +int main() +{ + int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h +} ``` -In this example, if `header1.h` is updated to no longer include ``, your code will break in `source.cpp` because it doesn't directly include a dependency it needs. It was relying on `header1.h` to provide it. Per the C++ guidelines, it's better to explicitly `#include ` in `source.cpp` so that your code isn't subject to brittleness caused by changes to header files. For more information about the guideline to avoid dependencies on names brought in implicitly when #including a header, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix these issues like this. +In this example, `CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` includes `limits.h` If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. It's relying on `stdlib.h` to provide it. + +Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix issues like this. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to track in complex projects and over time your build time may be impacted by the compiler processing header files that aren't needed. The C++ include cleanup tool helps you find and remove these unused headers. For example: +As your code evolves, you may no longer need some header files. This is hard to track in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't even used. The C++ include cleanup tool helps you find and remove these unused headers. For example: ```cpp -#include +#include #include int main() { - int x = std::rand(); // std::rand is defined in - // std::cout << "x is: " << x; // we no longer output x, so we don't need + int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h + // std::cout << "charSize = " << charSize << std::endl; // Commenting this line means isn't needed } ``` +In this case, `#include ` is dimmed because it isn't used since `std::cout` is commented out. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header: + +:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="#include iostream is dimmed. Hovering the cursor over that line shows the refactor lightbulb and a link to Show potential fixes."::: + +Choose **Show potential fixes** (or click the lightbulb) to bring up the refactoring menu. Choose **Remove unused #include** to remove the unused header: + +:::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include iostream, remove all unused includes, and Add all transitively used and remove all unused # includes."::: + +It might be surprising to you that both `stdlib.h` and `iostream` are dimmed. The reason is that nothing in `stdlib.h` is used in this file. Because it includes `#include `, which defines `CHAR_BIT`, we are relying on it indirectly. + +Choose **Add all transitively used and remove all unused # includes.** to remove the unused header and add any headers that are transitively used by the code in the file. In this case, `#include ` is added because `CHAR_BIT` is defined in that header, and `stdlib.h` was indirectly including that for us. And `stdlib.h` is removed because we aren't using anything from it. + +Now let's see how adding headers work by uncommenting the line: `// std::cout << "charSize = " << charSize;`. This code now uses `std::cout`, but it doesn't directly include the header that defines it. Hover your cursor over that line and choose Show potential fixes (or click the lightbulb). Then choose **Add '#include 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 diff --git a/docs/ide/media/vs2022-include-cleanup-option.png b/docs/ide/media/vs2022-include-cleanup-option.png new file mode 100644 index 0000000000000000000000000000000000000000..84e404400ed690a07692bd659c0eae723f1f6603 GIT binary patch literal 35558 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 literal 0 HcmV?d00001 diff --git a/docs/ide/media/vs2022_include_cleanup_option.png b/docs/ide/media/vs2022_include_cleanup_option.png deleted file mode 100644 index daf9dc54955b1bb2cd4dfac44460c5e2d5828c70..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83722 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 From 840ce7f0eb7fb964c858716edb659ac6ccdb5e01 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 26 Sep 2023 11:22:22 -0700 Subject: [PATCH 0135/1931] acrolinx --- docs/ide/include-cleanup-overview.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 711be67884..35280d47a7 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -9,7 +9,7 @@ ms.custom: intro-overview Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: - Identifies unused header files--improving your build time. -- Add headers for code that is only working because the header file for it is indirectly included by another header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. +- Add headers for code that is only working because the another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. This article provides an overview of the `#include` cleanup tool. @@ -22,21 +22,21 @@ Then use the dropdowns to configure how you want to be notified about opportunit :::image type="content" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup. The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes tags and Add missing includes tags are shown. The contents of the dropdown are shown, which are: Refactoring only, Suggestion, Warning, and Error. The Remove unused includes tags dropdown offers the same contents but also adds dimmed."::: **Refactoring only:**\ -The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the lightbulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring lightbulb: +The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the light bulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring light bulb: -:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a lightbulb appears with the text that # include iostream is not used in this file."::: +:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file."::: **Suggestion, Warning, Error:**\ -The `#include` cleanup tool will offer to remove unused headers via a suggestion squiggle, or a warning or error in the Error List window. +The `#include` cleanup tool offers to remove unused headers via a suggestion squiggle, or a warning or error in the Error List window. **Dimmed:**\ -The `#include` cleanup tool will offer to remove unused header by dimming `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header. +The `#include` cleanup tool offers to remove unused header by dimming `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header. For the exercises in this article, Remove unused includes tags is set to **Dimmed** and add missing includes tags is set to **Refactoring only**. ## Direct vs indirect headers -First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are included by a header you directly include. You can inadvertently take a dependency on the indirect header. Here's an example: +First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. Here's an example: ```cpp #include @@ -68,19 +68,19 @@ int main() In this case, `#include ` is dimmed because it isn't used since `std::cout` is commented out. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header: -:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="#include iostream is dimmed. Hovering the cursor over that line shows the refactor lightbulb and a link to Show potential fixes."::: +:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="#include iostream is dimmed. Hovering the cursor over that line shows the refactor light bulb and a link to Show potential fixes."::: -Choose **Show potential fixes** (or click the lightbulb) to bring up the refactoring menu. Choose **Remove unused #include** to remove the unused header: +Choose **Show potential fixes** (or click the light bulb) to bring up the refactoring menu. Choose **Remove unused #include** to remove the unused header: :::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include iostream, remove all unused includes, and Add all transitively used and remove all unused # includes."::: -It might be surprising to you that both `stdlib.h` and `iostream` are dimmed. The reason is that nothing in `stdlib.h` is used in this file. Because it includes `#include `, which defines `CHAR_BIT`, we are relying on it indirectly. +It might be surprising that both `stdlib.h` and `iostream` are dimmed. The reason is that nothing in `stdlib.h` is used in this file. Because it includes `#include `, which defines `CHAR_BIT`, we're relying on it indirectly. Choose **Add all transitively used and remove all unused # includes.** to remove the unused header and add any headers that are transitively used by the code in the file. In this case, `#include ` is added because `CHAR_BIT` is defined in that header, and `stdlib.h` was indirectly including that for us. And `stdlib.h` is removed because we aren't using anything from it. -Now let's see how adding headers work by uncommenting the line: `// std::cout << "charSize = " << charSize;`. This code now uses `std::cout`, but it doesn't directly include the header that defines it. Hover your cursor over that line and choose Show potential fixes (or click the lightbulb). Then choose **Add '#include Date: Tue, 26 Sep 2023 16:49:32 -0700 Subject: [PATCH 0137/1931] Update tutorial-import-stl-named-module.md --- docs/cpp/tutorial-import-stl-named-module.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cpp/tutorial-import-stl-named-module.md b/docs/cpp/tutorial-import-stl-named-module.md index f3763b7849..658a852023 100644 --- a/docs/cpp/tutorial-import-stl-named-module.md +++ b/docs/cpp/tutorial-import-stl-named-module.md @@ -60,7 +60,7 @@ The statement `import std;` or `import std.compat;` imports the standard library ### Example: `std` -1. Open a x86 Native Tools Command Prompt for VS: from the Windows **Start** menu, type *x86 native* and the prompt should appear in the list of apps. Ensure that the prompt is for Visual Studio 2022 preview version 17.5 or above. You'll get errors if you use the wrong version of the prompt. The examples used in this tutorial are for the CMD shell. If you use PowerShell, substitute `"%VCToolsInstallDir\modules\std.ixx"` for `"$Env:VCToolsInstallDir\modules\std.ixx"`. +1. Open a x86 Native Tools Command Prompt for VS: from the Windows **Start** menu, type *x86 native* and the prompt should appear in the list of apps. Ensure that the prompt is for Visual Studio 2022 preview version 17.5 or above. You'll get errors if you use the wrong version of the prompt. The examples used in this tutorial are for the CMD shell. If you use PowerShell, use `"$Env:VCToolsInstallDir\modules\std.ixx"` instead of `"%VCToolsInstallDir\modules\std.ixx"`. 1. Create a directory, such as `%USERPROFILE%\source\repos\STLModules`, and make it the current directory. If you choose a directory that you don't have write access to, you'll get errors such as not being able to open the output file `std.ifc`. 1. Compile the `std` named module with the following command: From 68ab00b638bbd7d4002534c22a62a7b4ad48f555 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 27 Sep 2023 13:26:26 -0700 Subject: [PATCH 0138/1931] draft --- docs/ide/include-cleanup-overview.md | 14 +++++++------- docs/ide/toc.yml | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 35280d47a7..679b82ac38 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -1,25 +1,25 @@ --- -title: "Cleanup C++ #includes in Visual Studio" +title: "Clean up C++ #includes in Visual Studio" description: "Learn about using the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." -ms.date: 09/21/2023 +ms.date: 10/03/2023 ms.topic: "overview" ms.custom: intro-overview --- -# Cleanup C++ #includes in Visual Studio +# Clean up C++ #includes in Visual Studio Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: -- Identifies unused header files--improving your build time. -- Add headers for code that is only working because the another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. +- Identifies and offers to remove unused header files--improving your build time. +- Identifies and offers to add headers for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. This article provides an overview of the `#include` cleanup tool. ## Configure #include cleanup -Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. +Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **Code Cleanup** > **Code Cleanup** and select **Configure Code Cleanup**. Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers and add missing headers: -:::image type="content" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup. The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes tags and Add missing includes tags are shown. The contents of the dropdown are shown, which are: Refactoring only, Suggestion, Warning, and Error. The Remove unused includes tags dropdown offers the same contents but also adds dimmed."::: +:::image type="content" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup. The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes tags and Add missing includes tags are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same contents but also adds dimmed."::: **Refactoring only:**\ The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the light bulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring light bulb: diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index bf61648091..ed89dd3df6 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -8,7 +8,7 @@ items: href: ../ide/writing-and-refactoring-code-cpp.md - name: Navigate C++ code href: ../ide/navigate-code-cpp.md - - name: Include cleanup + - name: Include cleanup tool href: ../ide/include-cleanup-overview.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md From 71dbeedc75ed348679557da280260b5b925fafe7 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 27 Sep 2023 13:52:18 -0700 Subject: [PATCH 0139/1931] draft --- docs/ide/lnt-arithmetic-overflow.md | 2 + docs/ide/lnt-int-naming-convention.md | 78 +++++++++++++++++++++++++++ docs/ide/toc.yml | 2 + 3 files changed, 82 insertions(+) create mode 100644 docs/ide/lnt-int-naming-convention.md diff --git a/docs/ide/lnt-arithmetic-overflow.md b/docs/ide/lnt-arithmetic-overflow.md index 0025e19be1..c1719c26aa 100644 --- a/docs/ide/lnt-arithmetic-overflow.md +++ b/docs/ide/lnt-arithmetic-overflow.md @@ -17,6 +17,8 @@ The `lnt-arithmetic-overflow` check is controlled by the **Arithmetic Overflow** ## Examples ```cpp +#include + void overflow(int a, int b) { int64_t mul = a * b; // Flagged: 32-bit operation may overflow. int64_t shift = a << 34; // Flagged: Shift would overflow. diff --git a/docs/ide/lnt-int-naming-convention.md b/docs/ide/lnt-int-naming-convention.md new file mode 100644 index 0000000000..4399f19f12 --- /dev/null +++ b/docs/ide/lnt-int-naming-convention.md @@ -0,0 +1,78 @@ +--- +title: lnt-int-naming-convention +description: "Reference for Visual Studio C++ IntelliSense Linter check lnt-int-naming-convention." +ms.date: 09/29/2021 +f1_keywords: ["lnt-int-naming-convention"] +helpviewer_keywords: ["lnt-int-naming-convention"] +monikerRange: ">=msvc-160" +--- +# `lnt-int-naming-convention` + +A copy is being made because `auto` doesn't deduce references. + +Variables declared by using `auto` are never deduced to be type references. If you initialize an `auto` variable from the result of a function that returns by reference, it results in a copy. Sometimes this effect is desirable, but in many cases it causes an unintentional copy. + +The `lnt-int-naming-convention` check is controlled by the **Accidental Copy** setting in the C/C++ Code Style options. For information on how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). + +## Examples + +```cpp +#include +#include + +std::string& return_by_ref(); + +int& return_int_by_ref(); + +void accidental_copy(std::vector& strings) +{ + for (auto s : strings) {} // Flagged: A new copy of each string is + // made when the vector is iterated. + + auto s = return_by_ref(); // Flagged: the function returns by-reference + // but a copy is made to initialize 's'. + + auto i = return_int_by_ref(); // Not flagged because no copy constructor is called. +} +``` + +## How to fix the issue + +The fix the linter suggests is to change `auto` to `auto&` on the declaration. + +```cpp +#include + +std::string& return_by_ref(); + +void accidental_copy(std::vector& strings) +{ + for (auto& s : strings) {} + + auto& s = return_by_ref(); +} +``` + +## Remarks + +The suggested fix isn't safe to apply in all cases. The fix may cause a compilation error or change the behavior of the code. It's important to understand how the suggested fix affects the code before applying it. + +In cases where a temporary is returned, `const auto&` is necessary to prevent a compilation error. In this case, it may be preferable to continue to use `auto`. + +Sometimes a copy is intentional, such as when you want to modify the copy without affecting the source instance, as shown in this example. + +```cpp +void modifies_string(std::string& s); + +void example(std::vector& strings) +{ + for (auto s : strings) { + modifies_string(s); // In this case, the copy may be intended so that + // the original strings are not modified. + } +} +``` + +## See also + +[IntelliSense code linter for C++ overview](cpp-linter-overview.md) diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index a149cbb552..50d87c5da7 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -30,6 +30,8 @@ items: href: ../ide/lnt-integer-float-division.md - name: lnt-logical-bitwise-mismatch href: ../ide/lnt-logical-bitwise-mismatch.md + - name: lnt-naming-convention + href: ../ide/lnt-naming-convention.md - name: lnt-uninitialized-local href: ../ide/lnt-uninitialized-local.md - name: Change signature From 73a8974c793e89ead780ab7739658d755805dddb Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 27 Sep 2023 15:50:58 -0700 Subject: [PATCH 0140/1931] draft new linter topics --- docs/ide/lnt-int-naming-convention.md | 91 ++++++++---------- docs/ide/lnt-make-member-function-const.md | 74 ++++++++++++++ ...ing-convention-apply-naming-convention.png | Bin 0 -> 23965 bytes docs/ide/media/make-member-function-const.png | Bin 0 -> 31113 bytes docs/ide/toc.yml | 6 +- 5 files changed, 120 insertions(+), 51 deletions(-) create mode 100644 docs/ide/lnt-make-member-function-const.md create mode 100644 docs/ide/media/int-naming-convention-apply-naming-convention.png create mode 100644 docs/ide/media/make-member-function-const.png diff --git a/docs/ide/lnt-int-naming-convention.md b/docs/ide/lnt-int-naming-convention.md index 4399f19f12..40a01c8ffa 100644 --- a/docs/ide/lnt-int-naming-convention.md +++ b/docs/ide/lnt-int-naming-convention.md @@ -1,78 +1,71 @@ --- -title: lnt-int-naming-convention -description: "Reference for Visual Studio C++ IntelliSense Linter check lnt-int-naming-convention." -ms.date: 09/29/2021 -f1_keywords: ["lnt-int-naming-convention"] -helpviewer_keywords: ["lnt-int-naming-convention"] -monikerRange: ">=msvc-160" +title: int-naming-convention +description: "Reference for Visual Studio C++ IntelliSense Linter check int-naming-convention." +ms.date: 09/27/2023 +f1_keywords: ["int-naming-convention"] +helpviewer_keywords: ["int-naming-convention"] +monikerRange: ">=msvc-170" --- -# `lnt-int-naming-convention` +# `int-naming-convention` -A copy is being made because `auto` doesn't deduce references. +Ensure that the naming convention for symbols aligns with the coding style specified in the project's `.editorconfig` file. -Variables declared by using `auto` are never deduced to be type references. If you initialize an `auto` variable from the result of a function that returns by reference, it results in a copy. Sometimes this effect is desirable, but in many cases it causes an unintentional copy. +To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. For an example `.editorconfig` that specifies the naming conventions for Unreal Engine projects, see [`.editorconfig` on ](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). -The `lnt-int-naming-convention` check is controlled by the **Accidental Copy** setting in the C/C++ Code Style options. For information on how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). +Once you have the `.editorconfig` file in your project, turn on the `int-naming-convention` check with the **Naming Convention** setting in the C/C++ Code Style options. For information about how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). -## Examples +## Example + +The For example, an `editorconfig` file that contains: ```cpp -#include -#include +class MyClass +{ -std::string& return_by_ref(); +public: -int& return_int_by_ref(); + int getValue() { return value; } // Flagged: ‘getValue’ doesn't modify the object's state. -void accidental_copy(std::vector& strings) -{ - for (auto s : strings) {} // Flagged: A new copy of each string is - // made when the vector is iterated. + void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state. - auto s = return_by_ref(); // Flagged: the function returns by-reference - // but a copy is made to initialize 's'. +private: - auto i = return_int_by_ref(); // Not flagged because no copy constructor is called. -} -``` + int value = 42; -## How to fix the issue +}; +`````` -The fix the linter suggests is to change `auto` to `auto&` on the declaration. +flags the following code: ```cpp -#include - -std::string& return_by_ref(); - -void accidental_copy(std::vector& strings) +void example() { - for (auto& s : strings) {} - - auto& s = return_by_ref(); + bool myFlag = true; // flagged because it doesn't follow the naming convention specified in the .editorconfig } ``` -## Remarks +## How to fix the issue -The suggested fix isn't safe to apply in all cases. The fix may cause a compilation error or change the behavior of the code. It's important to understand how the suggested fix affects the code before applying it. +Change the naming based on the code style specified in the `.editorconfig`. For example: -In cases where a temporary is returned, `const auto&` is necessary to prevent a compilation error. In this case, it may be preferable to continue to use `auto`. +```cpp +void example() +{ + bool bMyFlag = true; // fixed to follow the code style specified in the .editorconfig +} +``` -Sometimes a copy is intentional, such as when you want to modify the copy without affecting the source instance, as shown in this example. +The editor can make the change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Apply naming convention**: -```cpp -void modifies_string(std::string& s); +:::image type="content" source="media/int-naming-convention-apply-naming-convention.png" ::: +The code editor shows bool myFlag = true. With the cursor on that line of code, **Show potential fixes** appeared and was chosen. Now **Apply naming convention** is visible and it shows bool my Flag = true in red and the suggested change, bool b My Flag, in green. You can now choose **Apply naming convention** to change the flagged code to bool b My Flag = true. +:::image-end::: -void example(std::vector& strings) -{ - for (auto s : strings) { - modifies_string(s); // In this case, the copy may be intended so that - // the original strings are not modified. - } -} -``` +## Remarks + +The `int-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. This check check can be applied to any project that has an `editorconfig` file, and can customize your `.editorconfig` file to suit your project's coding style. ## See also -[IntelliSense code linter for C++ overview](cpp-linter-overview.md) +[Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options)\ +[IntelliSense code linter for C++ overview](cpp-linter-overview.md) \ No newline at end of file diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md new file mode 100644 index 0000000000..b761eb8855 --- /dev/null +++ b/docs/ide/lnt-make-member-function-const.md @@ -0,0 +1,74 @@ +--- +title: make-member-function-const +description: "Reference for Visual Studio C++ IntelliSense Linter check make-member-function-const." +ms.date: 09/27/2023 +f1_keywords: ["make-member-function-const"] +helpviewer_keywords: ["make-member-function-const"] +monikerRange: ">=msvc-170" +--- +# `make-member-function-const` + +When member functions don’t modify their object state, mark them as const. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). + +## Example + +```cpp +class MyClass +{ +public: + + int getValue() { return value; } // Flagged: ‘getValue’ doesn't modify the object's state. + + void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state. + +private: + + int value = 42; + +}; + +double getRadius() +{ // Flagged: ‘getRadius’ doesn't modify the object's state. + return radius; +} +``` + +## How to fix the issue + +The solution proposed by the linter is to mark member functions `const` when they do not modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. In the following example, `const` has been added to `getValue()` and `getRadius()`: + +```cpp +class MyClass +{ +public: + + int getValue() const { return value; } // Added const + void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state. + +private: + + int value = 42; + +}; + +double getRadius() const // added const +{ // ‘getRadius’ doesn't modify the object's state. + return radius; +} +``` + +The editor can make this change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Make member const**: + +:::image type="content" source="media/make-member-function-const.png" ::: +The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to change make the change. +:::image-end::: + +## Remarks + +This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they do not modify the object's state. + +The current implementation of this check allows for the assignment of `const` to member functions after their declaration. However, it is a good practice to declare member functions as `const` from the beginning if they do not modify the object's state. + +## See also + +[IntelliSense code linter for C++ overview](cpp-linter-overview.md) \ No newline at end of file diff --git a/docs/ide/media/int-naming-convention-apply-naming-convention.png b/docs/ide/media/int-naming-convention-apply-naming-convention.png new file mode 100644 index 0000000000000000000000000000000000000000..607e6579cfa4b22ed0ccb84ea037fca38ae04afb GIT binary patch literal 23965 zcmd42WmJ@H^f!tRDj+EcNP|d;zys1Xzz`xWNQW4tbV<#qw6v781LDv~H>1+sAUV>* z(9BQ+Gjj%?`oHJA=gV2^to43i0e9@{+Wous-glI~t_I}|<{LyrM3kBjRUZ=(5nm7y zUC|=_gK%XviRK~U*A=hF8Y)EPL#&&Gf3Dgq>nIZuRmPKF*j^+2Pv-v6%!`PKs{Qik zO1E3#3nC&bF-=uvqu16u3nW3eCTFkj^E^|!wrc)XPx%qeReE~0SKn&;>B&j+-kBH~ z=__CD2>pgIGE-=u|^4Sb-8-^M_C zMl5Q;&TgvGV;pqrMwkjjpa0g4mn)tQ-#5^s1%^%118O^YB!sOI5t%Z?K=3gS(0qgE zd*zcZ4G4)^{bt0K-}h3l?eSre8<=&5uN5pC$M@N%nvPKg`FYlRb(>WV3NrN`XN86D zCo_FB+jfRo@;NEYqo_s4tVzpQp%S<%%L*F9u=_wJZRE_Mt%j$$%XmQC|N(4ZkSkZkGZUT|kgd zOi!d>W|L8i&cMJD|C}$k3gD7HvkF)pTQC_rk$*uvYTi@{pB@1_;rxWgKh!u+#?K`* zTJD%YjZZLoa~0OF&L>f2PK<-z2v|eg^J@yxaO0-M9!fspOvPcC$63d5kx&-jH5m@) zYRm;*wYj3a)X5-}!E2ZVw%eLD>VL^kC`~9X<`E_KM4a3dQSn4rcX+(~$nazk9Oe2w z6mU3fgn(6+z@u-SjmM%G>(L+yj+ee`!$gX-5E!!Og(`?Zf|Ps_h>wMV^vva7x<7l> zk3b-PzSa7m7WmYR44YpzQ|FTTk&_6g_-XLQz?#AxG+zFmvu^|7g(BL}|GxX+(I16uN^ zu25p9xX{qOuC7yBs)&`|I13zu&>|}f5b0ZtU)>vv!#tC&OIU~B2v1&Pm2+8 zV}i?+_kZ$0N$y$!$_@9!aE4Ibs4LWkKy!p%D>HOYarB!mu2@R8*ojXq#25Q@YTadr z-F~Adu%>>_fyC0#ff!kloXL-`m)vzO(`OHUm7`*wNq>bDYtKN9uW}ei>fx&p6FQ^G zod~xTMud0y-JLe+s=DX$N zd}^6f0d?JxaAE25ZT5pl<4AgqQt2k=3n{YPTTnBs(Mc?*oq@Ft$(qfZJp#s_zIS9> zjP)9NYy9PT(C}o0rTur&HdQn-I`4b4i&dYxG%J16?w{q6YAp>hHe6Q;qNI7$5{k>5 z#^Lxn&)zSCdm?ZX@pHL5g4bs%o*Z>Gjd%V!vYL$^YS`<^S5qrc$1~Pi^-0K=<)aOZ zShr#ga7|MuY8$Mq=3GeQhhC~qKF-Zso9QWf7!em__Ni^+m)s!5y*D`4Oco6&WvRvI zO%0CWS)u3q->>ah`!14w^P72$5y=^`pP8AMAJ&RGYcby&g7Z!lP{r4{jJms*+!HF? zfa(}$jh;&b!HGj;lypw2wHM2sb-94qd2tRtHweCKlqm$cDX8QD*ezk4lg@`(df94q ze`vF`8>U882F3kCcC7{HJ0XYv=sVRU=$%N3ztWq#LO}(8L_e#L+?hK$rnm(tdQy=3 z&?Nx*WOaNCxp|Qz(wTyp)^ns}AF;4zL$dDl?QEP(Gdd)S4+qv9M5y%_&CC)Hc@gCT zVF&7qdkjq%M8d8t2g29TAC2>=EEg3}(8oF@fZ4!9c4{ukwLaWtds~!~IrfMwvlAuY zFW{k&_E^_1JaD6s?!i$~1hRI6b^P2N0riSXmlKu+g8I&m6wpbr)K1#)5=HTGEd-#s zY3l*TU!_6~ypMYAnl&e{ZG)-{Hr|KRd9z~ROkU;`P@w$xaZm8li5c0^VvsagH-g(9 z=V=o&>v7ZMRG><^%%UC3fvEU<2;ApRtUFA z|6Q|w0bQZ1vE{9_&Z;S*yCsQQ>X49Nl^RGZ`U6S9 zO}Py^mi4HIc@EQOD~CCqv1s-7ogYjsEqn_j;1$GJ+^{%Z+Q}`)Z0VDl7;F%Bz#dSZ zpm!q5^Lh&cUszKJe{h8g8}1CsIz7yZZ!>*8uvM$EOkRC|(Yzl@$^;(4<&v{7cuRY> z;rh9P#;6HQ+H!8Izy>g^9h7?e0~fI^V4V|qY|CaSE*ZPxjFdX;iaW#3cl81Y38a6f z)fQS-l=}iMUF)sAqLJ~EAKl!TXwt~_Q{ZKH0@!ePD%&pSSF=xTG8l*Jmg!9q3c>00 z$2!h}W_AIc52d6dECTfLvBd2q>-_`Ij}y-bQs!(4wL(ne#+(eV4(G2yz&4X{?~S<@ zG<=2KgmR_@IA+qJ`c7KT_SAmy+ZR9lg_pb#Qi`qJW&j`fcF>eQl3R}DzV1~1QEbTb zKyaRX73w-*7{a@H8 zehd}hvjjBY1HJZihn!Eq#TJQE)q{MU{zFaCLAoC#>vl}&pE)t>veXE&$SD?qhj-<; zCpG*t7No@*b+1Ij7q)Uv?|i*SOnnD+nM_PcVI#R155*^wHfqs*=V@LC(DU7rw}|}g z$?ztS%ye5D#+eW-=9V*Ugo0$IV+~879mea;uffIVU7w;@hS*n>^a^Z(+!WA$xh?k7 ztGwBYM~7>ctILb&WlcfW#p#OpWx#YG#4uOQkr8ewmm^;5vKOvbTlig2iLE%+>}7-W z#&RD+C;#Ba{nLOS?|^9w!I9vdc%6LM=-&6i37rPT3xiAJ{zgRz_<%I(Jq zjtg}P)W=zsT4*xTXb3<+V3WF{Fl26oda58Cw85mr(BSL7Y#-+Jn3J!5!DRc$HS;n4 zw!5e6${{t9`seflDpz?<3>ArefMQWB%(Yq-Ik9f%g?Gdpp?9tmmLod;#e>eZngGnU z9w*gBD_*e`MO(Zb$<;Jt!}v_ciLi|P8mzkJ8n2&Qz7nL)mrY_+I_`*(6sf;%>a{W- z4w{S}qxBAJvv?7(PD7yfCfl^Bg)f=_BoZX5xY736ENR0z+PaEfGS$$_`$Wn^iV*PD zR9U`8JOeSr?PPbM+J0CuNcxCLY0CU!Xc2N5YB;qy(IokJ>>ill<^ux=PDO;l$*!%=ihR; z=!qD~^?Ws|)OXBhu1{$;D7 z7Fu=ZfbO3+4p}j7*0a^_4p8IKTc>my!dPsE!_XfDwoW~TFSkM}l>-C-l5;z1T<6+C zqJ_Cla%fxs;QI8JN;&6ENwId7#A$b3=+XY&lMtAn1Te+dQ@`q$N`Ubc*w12p?z zH2=OS8S&4}e=ackLO5)Oep}TN@Ah9dpww`wWezJ{5n;RNDmSFaXi zLXD?IZf)_)+a1V^K06#9%4zkIoi%3i-Vb*;Q0`0LX@~7tEDuRXa8E5oHlJjNk<_f( zR*X5DDFkfOW&=CI=m+W8;^J%u6or@xD_7lC0ZS5+GaTn3bnj6`kW7^fdXH^Zs~0VN z^lHw>zP3G|nWycP>It+v2dbVKiu398t?T{woRMfc9YnMcgN zTLF357%8W$7UW>FF!T$KMCkK_LSX{~tDLigdc)aXvRq_Eex58miTqLt-~0%I4O!Y$ zFr&lp;CcXaKyZ|atXxv7Rx6xa^Q`70;ILi|p*M<@6W0)SiMm}EuQm6qzf0Ehgso!E$ZHsOdK_;`Fz)!HI`VEwa_3#aO zxoS-Gd26o0Z?||6xj}&4h{Gi|bEG3cmRAx2j0iQ|P}08Ge`2qiMns?|5{i5EbbJK7 zqXd8C5f{0;BN@=*y1D(%z}wi}r0ivz&1}A7_c{z2=_4;0oY{@Kc4^XYC=O^b)FRBc z8R_P{9wY6~rG{K?k4HTNZ~uA;&7youD+~c=NaDzMaPye0W{xptohf0wp7&D?Mu$BB zWX;z)5$wk#WcR)j*k@3-aQ=)c(a+hf(;-ke+MqawfXzV8$Htj=a&_3?u)P)fx#U7o z*QK~4Hh_ywsmlDgjjomQ1_3Z z$!Jba!2zII(D&ISfoI9?D;HC00Bk*qo8B>nHs{>w$3SrN5tA`nYtOPHvYcH{TK?W* zP^bUsaHh=BQR_~fr-bB@M-Kffrc#A04UPd5W0r=|nf9O|cf+l-nnh@30JDdV1vc8a zv5-MC+sgrOV(l!a=jHWe;79?uIFQSI2vH};c?Xl6A;&P9FWD;nS`@*sZmqx%-IEX9 zRlOaXw)IAr>8P-J18COG)^Hq(C6f_aY2@L5!#B8SXu?rWq@jFsP%AK1vh2fa`yo>e zRh7hhE4+I$pN7AFi<~(GI0=ADw`I^pfwN;luB{~&W!4r{_gPHlZ=S2h2j_(-rU6m3 z5sFwP6l4EWt{Ewh6rOG4GH176VY@aa zD?cZ+(>0PDJj*il8PNa~yjif&KZ-YVDcR)yIS`J!mt72!%QI+=>%3PZ@TAP9{p0rv z<1ecVZA;qkHBF>Wwv=~LWZjxLzl^eFO0HJkaLI|Z?v$G)MD?-o&DvAlH^n>ey)YGG zPa{1=HrL9kosoi5Urg8HhG9vjZJw`+@Kom)3N|YEHm=D$d5m8~EjS9act6T_5n!d# zze2GbmUZ&jE5&hZ49ZCex=tZoj$y2`t!lM-esbUp|C*Va+ky~0cs8pdD{23+G)Ar_ zEh6&3k&2?&I~ue|JLCR#Nxqj)N>8_VVQ2|4?@-yT1a@3W=JV=WFBg*{PCG`3F=6y7 zTrWPOK=9>kw5eY8dxQ~qovcx~+>eY;(cRv1_pse5)ldaLSltgo7Hjxx%v*&ut13(= zrg0x&WwD2a5Ipj&?W6+$;Q@0uN?T^da?1uQNJ)(JQ{5!H7A+??KUu%qd>O(M%7Pjb zPyWt!jsV~Mm@ijuj*M_nNTcO$IE_E%@WO4l%^J!ab=gSYwwY+_t)QOD{_J54Xw{Ey zQgdT+ACW0_M7522O4l?aow~CW9_u>mRbBN0AXd^pTIp*k#Mj!{QH{CD5{=-LJn%pF5`AG?T4A3E?(#h)4 z{^Nr=RKQ{BRQ6_QN5sgU27~b4C}3|GqHvxyqy%ICHE9yE<9r2A%$SM>p8*vS6Ot0x4P9G1HCqIx}t`uNVP^^t`Yj?46 z9wQrlIv7RPo~^gOlpyq@#-T_WRN1dLe7L3{Rl#l}UZj#^sxj)(-^nCk^PJA&({Y|c zS{9`M_`VY|=Cp`_8WPVc#%EM^*~`*Ud?!*OJ6YWuWJM60`7c2l1xzeMD7V>I!|1M* zJOxA0x~_fu89m14I_tIYI9jkj9or?y;FL3?!b(-JTK@T`uzsmwzL=< zY$s3lFwW9#l^koxAP3+BJ(`1TBP;jr85TIiW^thW=Du_L^ggeh7oRMdz3J1IPK{;F z$cDg~=B-pyBF7}9%BZ(j9YpyD?@=K2CLllPgN{$p-atIQ z#?}oH;wrd9%L%)=^mC5U(?fdb7o#UxdUMOhdI7iK^*B&t4QlwBQ9bXf0S9u}U=t$&2-(JcFiv;IKWyA@|e=A|HVw=!iN+O7`$ zT6QBd>@Bzm1kNFKcq0`EJAdQKh1NS&g2@&>V=L37o5mPqIg)oqmZCl=Q27{f7s^!dX9I z9>*dWZg~rz>?)zqicRV<4PRd8J=whuwylAyZyQ>m)9j)M;%JCXb0ydtA93bu-8RrA zVSj!bBUf*3r#*eHjutTHIxfRCk1hI#D}n76hM&ycD*EZyqqvdFk`>g}(tXK7)+~1| zQx5b%2n`=ue&3AV=npK$-Mdcw9+t2bhXX1AYP0{`42bhswCf9EH=dK)&`hg>Eq0$MKsMzoIAm{NFbB2evE> z26^asGs>Ru!-0+IOlgEVlTsaOP2E~(t!G~G*7+QjO*W+az>MCN5PG?G=Eg8qjn}~1 z!2$6$ZmVoYnr>kHbPbH^brS8m9izBU35(ACQD+O`O; zv!NNqVp3p7DE1B3Li83 zS-^wZf{o33GdHA$UhnKmuMPhZlv`QP;(uoMvO?-`?A!)_=UwDEiLZtK#rx*LHL8Y0 zMk1nj(RvV@bLX9kgSTKi`;Va@tXYB6wuKn0m~fV0++-a*&yH6{W(tr;|a0;E_hW3YX?6}dG22fFwrfvBw#N_**4Tl z;m6QKAE!D&+~P+NTN8cJ$9=R$NCt%^_^}tNXNa$j`8Y~1?c{WFuf4-{*rx)On9Wlo z?_awnen&0ZSMj?c_yrW$Z}AXph2$P|w|D?f(DQLKC{tAy%F9aKPp`%k&q7yJb9WRv z@31!3tkopAqxupj^Jy*A zNpR`eb<|i`EhAI*y+hZXsQQ}k{V_HzY8OXqmdRp_9S&irC>{oWNU%ib=`_(v5Gi&R zp82I!voY(=c_5u}qjk=61+=r&P#KFPI>lreeTK04FVOS zWHF<1YuR<<)e-Hjp#Dns`TGua5p2aFQpE*UQK1 zw9f?gw(3#57gcw^4R2F8AgIGdHmZsQGf7VT8&tOELXKZws7gCyTOE;t-jDPHXHz-N zAlpA|hEgCE>$HsdfmjvcjcK&q1$krDWbMKO!N*P_68<3@a>*M(qu-YtPH+taI3~jR zj8o2^3X5komu>Rfm?*7);^P)b^voKE*W?0-?+{MwfBfo7NowZv+s3}`lr#T%b~`lGKw(ZE2V zEoYaIhOWKMG|_Y2#bw~Wam4HKJZk(J*vF6cywFxmAth{O?#x#QJf(!7X0n&8!GE^$ zXzTi-lKISylC8RbS>XrH&v&N7uTu)_6R_=H`RJu$Zl!V%oAYT?+b7#{3ebq#18`Y3 z#_hlgmc5oD<7bq0Xfc~Bs;hfy6vXruB&2A=d~0;Gnha(?$HGE5|BBFHzL#jF)l|Ja zD(Rf7xhX^&8-QN0)9aA8DjMw1rQQ>JId=dv1ZW;BK6$E+#agjopRpIeC)0x^6;_P> zq=ddM-f#O9U9sESLxT0?7G59qY5_&Nq^E_~vQ;02_UFf+K4bSt2N@Z~g|bNwkQj=ICOuRI+;Z$x^fTWoc)d1j5lW+iKCmxzM~-6tJ$n z(@tIc$2FB#w+J_tZdZd5u%I)J+BkLvT?l+6vdYwCL!^me9BH1}AgJ*H==yh8*XU;| z7Kq;*X9PCsW@DUBa#k|ySbsJ+g6kN|x`q}s^m1CBnri;@@Slt-;IE84AmHK9@oXC^ z(w4`7&=rTh;QtzR>KjjWF(kU$Eyr5}_O{EF>gu3}Di_nQz*^DMxp}#{f0gn=St}s; zi}!nX*y4V8u!!t`)lmTuIz?|6DF6rTnEJBY(x(yg+#unv!IQtdpj3UbJ}>6_$l%nj z$zHGKBJ}w77+SGc{wk!dz9z?}`5guSSn9zdSK(?QgtpqKz>pwjC8@(b0Y!^RqAoA! z0OZ>j7{c6)>0qV7nn@ZLL3_#N!&YrU2HHuEe~F5#TML1Qr-$VlNDGe!pTqMy*&+CW z512;B2aC5`wqCt=xM7#00$4je*x_KAL|#ch9nSjM?ALzkqIJ%`P;I%6+bOwDeKAyN z>l!F(_J!+r$ugAn@@$(L*U1(a*k&H^Sp4VOVNNpLR`UdZYOW*?xRN=Rj*;Y~0Gp$N zucIdx7~C_H3U9}LckxoMz4s&S&`^jOb2FQGztBIVgc`?H4^!OM_+5=8mB|6(Yui_j z`k%5h)kJVC0JlB4D}0Ymhx`e-$w*K&lWu$Z?DY+-U>8`fW(FobW!MJo0El50FSk1{ z=Cz3s;XkR!+E<8QqdvzT{mJpWjQJ*EMFx$p6~?$mlT=^?+1 zk~E(3;h>cjS)YbPDHg(>@+}zCr4UweN4HJ{ra0y$BS?x;F z2L38Xlgh9I0VEfZEoyzKNqveRBW7J&>t8e?lZan)1-$`+A3bhCsV@p>r~%zkw=jG@ z0iN2H9&ty3QZZ0dSiqwP?4Ow@k#8#x3eJw&KKF|I_J6ScAG8Vj1eA~GzX8p1{2Hk! zc(qqcQGfZ$0%*fXC_l_@b~tNW zk8MUh3ZKT|X|PggOx@D~Uhh~WY_z+BficPdPp|a>4(&pN7~{VkChIE&b|WpgECM&u z@U7br!ABl3$v)2y4RYd}BzT4)A}z$on^!5A>Q#>LmxF%*r}tC~3T?*?jKT>aZqL!Tg~Yf2b(a~0YCpx!WfO^sdMFINL*uA7OYxh2rKifzt4 z@qXF_%d*+fiw6C-|NH2OPu@U)nRKZyDt=chrewPAz*z{H0%1JRfxB8r9sZg!%ZtGO zBPw??EX2ZC1w4H`_&!74a+?bV9?*LoOd%Nc*PKq+jrA%E1biJiQDhiSN!3_Ii)r@W zR1p9l{BW!So$j(Y-OR_{fN=aZ)^l&Q&lLiH;|a430hX6W;M(8+{An8c@6=CPunNrT znmvM1@OS$JLIeT)Bs7N>ntbvj@uhjMW~%;*FW+b|A=xP-;N$HX!Z-?VIS6}XB05{~ zSN}qVijX&|X))Ebe+OG-1hwx!A)FNZ-E}-QWM~BZBy{(cFa1Apj}i;M&&=w=AoZfx zV3do{33+l(eb;M0^^yU z`AIVH;7Uv?qEarqD{u6F5l(B`*3tK2lTsT1#Ah!MQbL} z-NaO9a$!E{FPSZ$T&5qf4s!%7K=|yoCJx0RdhZiqBU!IITxy7x2q~C=VNhe#SkW@` z+Run#b6#|Aov@6WHz}cuMDUbQnct=60WAQ!K4we)X~)mX=NkC22W_?N7Zyh!>(25J zv^1pHd!Zmwy)+S<88D~+cq;LQ;G5rybV5yqoKxpCfUx0_QEmGH+zPvjou<9(7-W8vtFfkYimf7bNoSy}h-U zYh3cUXb22kjMK}Ia=zNPzaT8j&`#jeb`Loj1J)^yhuFwB0lreB3F6^G17H7;Bk=ew zCO-ZSFXo3AV&k=2!-ohFl-uO>5tx zF7;#FvKId=^DA8x_X_0X_!Tlzp@M$9AL^$_Pze(UhnhAzER9eyz%_b!nrw{AT6ER! z5zID1dP9joAZaLC`0d;O%_}F)1iA}t4zKXS7llI~r^u|X>zY>S1nqK2|8I758o=#l ztVG}kqx8S<^9R9}uL05iWwU(4fG79VD6YH+d-|J|t1OC&?>{2QLvc^-6)^X$E05cL zgb^nWg~*|y$pOeSz2a8haL!2+crCxBG#=lfkEp~A5gde+BPi&W=qMw>riTL1kc5*9 zL%ju))3#bchG<>@!RoK!`)wNb6WXjgX)ayi4clKbyXuCJVpM^d1RS%C)iYw}mYXY7 zGjo3(=IB4Az(R%&FO|RhjiB?Ij&s?Uwkf5aFRUCG#S`<7W0F~^huWL%Z!Z< z0ce5p8mp2Gc>0Lz&R5xX!Lpo|SDJ9vwY%S61{!+ReM~j^IsWd&8{_(ioz8dopvt?B zKi|q*yi8H`_N81yt~b2!XbhyxwEOvd@dUaRsAO-N;B{D&duxw>2GEL4r7Uel5q$m! z`ESu(`yI7{v(7|>7So>*ROoGVzRHbi!+mQRy>t9-7&&_uBnyD5a0 zV?>JCKl}N>nju@LwB`5ml>aSH6C7hZdrR<$Dty2A*uzdoLI+9VVc6zN`K9YqQC<;6 z@6RmmA~k%F8O_#HbB>kkP30k?Xch*@3!9aoNJpCjQH^~g*Lw5p#>SAvJkb7L6QHvz z-ob}5_CP^R%cJ>`FvM>r^jST&7CJTFQAuynzMnY=*y zs`Lgv^s(!!iEp2bbj&D&slc=j?W|Q`(1|TuS`HOh6%J{HamLLw(r*0<1_w}M%N4Hq zNChmo&2TUHwW)Q-u>~%LF?PkV35FBj=i+(`va3-wFL$^RLk+k{NaeZy%9b!na1mF3 z*#1~57i0gOO6pVCm~7+~qBr+Dx;1Xn1-~8P*dB{jbZt+s9_3+ZCU4FQncFT`*9N{w zzB0-Re6n8YsklC0>Z+Cy3aW4J?9JMYYGU3D1<4fRZaoY?fhKuCkirss49_x0_7rf} z#R*cq`Q@c&y&HHZ9T$x9o#3L47u8(m~(7V_i!&ew=3}C=s7}aL*8d} z{hGf`rS=WP05;Be@_ZJqmltaA?a zVcJq?@f1(X_D^V7cpGY>9ape+=-eJek@=hl9cWs!sAC0gR9*G~)2>*HefC9`u7fsA z)09Qdg)Cl!H%eN%;cvo0DIAP1!cNMlBx{Nnr>CZWmAkf8jN84TQ~~_yg&-l7`B#=h zfoKn2nUmg_{FVn|NRI?sXm#}`I~}T-62s^GqN{*u_o9{b5`n3hFNd^`Um|(LIV7GP zV)$9s>PPe@)*cVj4=GQt?!2oPPiZm^P)f7(Q^P=VP3C;UW9F{;ShVcv-7!gNPB(0> zRuhXmY=c+jocOiffB;T66FDFp?+7C!KZ*YHG4^12I*1KL`bQOCjM$%=?w&csw<`kQ zK7ESKc8i0F_t;CmSRY6azdv*(uBcJxx|~cS1qt$Q3@X=Be9$JweYum#IA-`pLkP3n zs%H_QL1pr!K=_??Al%8P`SwdT(Qv-kp)6g1P?t=Rg~qCJVG@l`d%CSk zE%6?WovEk~%F!%*rue+?PoR%tiz_mG-|qceBcv0}t`h!nbJO9v6;!v!?e>El;BOHh34YO0fh?T;!M)r5tbdt1|DEa2$UmwXAw$)EMQaU@B(!@WR?t3$>s;j$q zXSbKG?`;1SWyxpXPqlXrYb_Oi$i0V3ykhoA+Ui=6kL9Vk-yW_{(x{(fNktn_b_`X{ zXtWevRBBuzG7I?)g)X6kS-fJ-nG9O)JYp5PQnQW(xw}TzI|p*Im=XM8>06Mh)GBf9 zgQdzW843k5`&<61Py;7sPUO6_aA8u(^UW~Xve}syOX6KllaT#Y&-HbB!wolUQJ-c9 z6_M!F!ptVpcKN{vqT90OPa5l7M_0vx8A8+<=P2D@xwjxZeN@Pr3FU0+r0l^5QStF< zb84u>3d+|ijWVIKEanb3k);$RT+`p*oP3t;`}*O!I7fyI>`T!^!Mn>^e zq!r;=sp>^2uJD&duN#r&Pv!O6!wUn$O*E|%WCd&a;y;8SeQ#RR3`f`m&g3G4KFUgE zM9JFc4P}j()`r;LSDN~@l21UUgz}y5RDQfYh#Z^s0VsYzck~X#XZe$^r4)wRynR3Z z0Ikwyhcrm1#yiO#C{EEZ4!l*esyW*i=|1F_;o$9NPJL!)Eo{I@h{kJT%>9PxhH*`* z$o1gOffmxnKi0A86oDZDp7wf$P)p7F=IGm!W^Kk$AK~r>&f1W98gpAGOBkrt(!YLO z3?(_H?O^=uTkp=}yBXCGzyr7Y^@T}Z^(@AEc^)>X@Y?QtFH>p?y|B9xJ0d(-pU>k8&6_*dhJ@%{m_qhy1DuX8+& zs_o7`=CxLj;Gx@O-tE-d-%DM!eS7v@$8wmby3pkgaN z5BblfB z=`ZHfo;{aQSK0CbS?W+~so8FdV(ybMhI_*3AD2JycJF94= zu{>LReh+2pn#iJ+PvNX4C}QurDAW;1;^fhMM)bD*UwBcf!9gTPK=LNkP3sOn8sEl` zhquF&n{I~kCU=9r2+zuU`IM%;cxqjK#qFJc=PJc!m~H1ois-8_#&!9-qZgFtICzlsI(>?m2>KnO~Y(_=pr$q}zJ7XV8cU64P-0&$xc&E8W&! z(9x%U4F~_9>&owM9!l$oP!!!!RLrsY%%Y44gM|2xI&tcEAJ!mE&qC=?o`Vj?PLCnV z86D%sbOB{lkM(?RPS_|GXt*juT#-iioK8OYP*`+Zd_IOwBQcpwviqzQEc_%Zv)}M`D(10GktlM|} zPwQ!w9n6NJRHb}I!(S;=2zGfTQ3$A7m0Ng@5`wCo?gZ8Ps&X{lO4jP~L=i$lDr1yi z&n$wePItjk6{nA|2@o=;7x!xCKiYWMa(_WyD3&&NLBP$fg^83U2J0J%{XF5ha;^II{eVB(eS1^Hf4l6Lq4dK3g6WR0Nt6!eqjNsb z{oS;Xy6aEG>I*Z!2_Y$%>a}VD=5uy&cRimpvQRRElEr)2B5g;lk6A=|T8fE4-T$ju zf0yIne62qwarZef2_tlwr*(F9T6n?5E| zGG6{SAVezC5(p zBRrb$-=p~brS>z_hKNnuMQ1dlT9PK=Xy&ysq+mb9D*Ea}aW6@PB;d?i46Xi9cDqHC-2f2`F04_E5{zuSWYB;BU$2EJMdncuCWBI0}%+0I2MF8!oXfq^MF z$|oz_>M>{bl|BRw0{_-v3q zVKSwrXKToIoMvb*i^X9sQUB2`4i3DTEax+Jor+=yxxfN}!&0hT7v@A-jmls2j*~Mo ztM{5qydd?t&CcTNpaIc0vs`wMBy>w8=?LF3S|ssOMLgfxUkdldPr(k?@(UhLgU$y> zzFWL>LExu%>Z5DDo2Ke3Aiys-AaHoCYeyujjHmbMu?4XCzO3NuwRC%ghJVlyYdgPS ztzTaf~1fFni?bm_L zl*q{&^oZ^nx4v7z=F(Ug?ved9_+)X)+rixN5=I>@6u3~I3q(9VuRD~B*G?BhH@!Mo z7H1$xu*&*x8H9|umB)OJB?`s;adzlYWm2LsnBk;{>w&XF;N@IyC!aOzRaILo8V_TS zwkY#o1fMMi*6d_<$B5QIEz(TNTTX27d5$L3Y)-d3e-B;f>rZL@>zae~cOl^UG#lpG z!LSjI3wpx}c9*m?C9p$ROpk@z5y<#g(NsLE=7SS4Ar-)lHRt~X(ny23iNQXJupj!Y zgnv==*jmhQ-o$1!T!cfsXT-H&9gS2Qk9!|4RnxD6(0~L9{T(*RAS18<#7Jr`7!!D(=)a2CE zN%W^dr>EOae>@`0=?OXQqwI5;FwH`^r6!&Yebl5$W7v-^fb$eZeC!&>@)o^dpPbDg zKqBXng30G!&0lQ@gU_j}QoUMwij7?hPedomtZSVb?{G`SusYsebEb@m`*Lk?cV>J< zcnkd_tVT$UoE{T+Z2I~+!zFg;k+F4T)~g9ZO;J1@WFhzsdO~R6u)N`#n6+t@{K%ykR-@fmes$zPlAG*_yNX z=`C}c0NijTp~=U8gwS7m+U%>xAZ)q&our@PUPoYvu4JKsuk>u?bI`_WO~AxXx!i8y zleVDb2dQQh*h5!?`pNcLjvM?Ao?xmVG)iI^;+QQf{tzJ6m#uZ3;?p3+)lUYjeF*dx zgxKUfE!@kC%9ib=vOIk8g>vWWw1Fc1wE%NX*;X_yBBIV!hdg7kEEBTu?4=mGfJ+S?s58LUOOzhLys>z6`v za-Wo_3yGoo6)#GuKfWca9?)p+4_$&r&C8J!F3=VTH&WhH0O3lPSx*|4MoF@H7m(m{y zI6uaSgIg5t2=6ZRrBDmxKC%DA>$j^d_~&OIXF?DK!N+b~G`@(kO+Hz!=4ARLljy}X zR9kAZh#Jn2AkG4(J$yCsQ1Vc5`+QtaD*J>&KR15yb%^;Y#aU^{^-ae2eCeZQEV(+p z+QZ=8$RZOxoOgqscWZ!r5A2tXNrf(oP%!bD<^X+SSe~oky0I4jH~31Yxk31b^6n|_ zVVpN1o^cdvtS>iQw6PR_^$J&I3i*A) zA@$x?1mvlQf{dop{zgrq`UsPX@jt~6yJN!}+SyL~Nc_KtXKqSb<}FV&%?I)MoQ`ErnSG3tepVWv2@T8gp}aHB~@AZk6O9tApEjutnzo&%;3CV7R?h=T^y zy&d~#`Yp@WfV}EE1lh~kE28^bk*S?5{x1n$9UdegNFW4e#^Bni=~yJhCJ6SoW`rw# z1L8_69S8;a^I+vt?j3+4%T4rtPXXf(`%?VfVA&wq>^8jhu6sF1$b4UW9*1~v=p3nX zmj5?w=T!y5F17$R4`?F$15Y1$l&onXpvu%)em5d zf+z3A^8{2%+IbTxUqmF*{0=tb+sjEm3aeU@(T+x zw(njo4Q|*7`tUezuqe)Mz)W5@CZ@R=e^C}85af^rpwZPUaGm*{=o=sYhj&ub-!l?E z^59v8xxvcpJRSj9CB*POx>S!p6Vm#;A(nGI`0O^O=(IRTWoTo#kfYwvj2b(ibeVDI zL#P+onHuZV$erMGbuL4Zk(M%EAd`Ye&yJ8Ok5ca^h`Va`6DrXCR4x zIA;a#EC)vgVMcVub>T9m?bX_@_LvA7{USN0d%p)|6kc`KZBP?~|M>|wajMn);^z}N zjttR|MdHHFYxP)-MD?!h5jAbKI8gsshkH;0TvGx5B@Y!lpJG^V{EN%Sbo z2|rOpm`GhFjNIo}wf*CxcU8coMox%nS)b(rmjc-~ykcj@nocJ3Y;_4$t+U^jP<^t1 zDWT&PhT{|vnf?y72ojaeejIS7A`Eg3o|?D%bz%k5 zo_#OS7{58jw>Y%i3KP$n?QJ6~wfH(+e8Qc8pe~4mS+q6BC@!2f8E0mDRkt$EQ(ac) zHsn=NlGB7viMwm=wqp3DBx!3YbqD3}IX8nHlB$*8_eP8H{+;hF5g!Q&m!6XTYnwF; zY9d#t96GUU~)eA^bmOqypYbFKw^il^4)cB8%po;r)X2XoXowtGlp@ixflWW|kdyNvb;h zS1Y7d9;E{MHs@)YUitF!K<3is%!tq#ycA@QOnyDzuoWgqdGjXdpk;uJNk93%Iqo%X zBcVcp9)zKb?PQP@U4K_xS^4C`oOZ$NaWTK)SY7E@b@9U8=}$(jFsR5ak;!j)7h*Tv zUnV|}+i`OAryjp@AJ&rJc#EH41?@8Odf$-}6b~wk>aFeDI^@@oU0Hq@1}+_vP5HX3 z{st}+$rrZWg@^eQoyMM-G+WS+HNH1Jo$?UM4yV>5E_f<~xb2Y^;^aV-->KFk${;b~ z)A>t7*-;z<|3Kqw+yjzPOR?N#lel5lXU>diRpWAx_o#GjonIAPXGR3@Sw*J4Gg=a? z{$$-q{>^6?)6N?7Bb`lZ^Il@mPXSItvFhGg%UG0J*SrN| z*R{Nha<9c;Q#GP6|n~T`T#qh7Ue$yZ5qC@Yjz4#R7l-k8P3a6n#@CjRm>t zKL@t8$r@C+7HhpN7Llw?cbSo3i_1}}Cx>It7hRF*_eUh8!AXe<@1>DFCeb6;JSF=Q zlLzSalVy!=i5$#Dt-BV4su`Ei$sBgr_(WS)9A%_pK^f& zg$)@{4tIwU3JX`47p%AkEa);$o)~hOmN5A!8*fgWX_99RfC~r~2KK6zwin5FK2~?v z1=z}O`bkGO&g-H!tR|JMQmtvtfpx{^4t4IUJ}<$x-Mo&0%xHQ}J8$w=Os|@NJwr{; z`a@+{uUvRQIlG-$+|fsdz-4PC&C&BtomE~T{N-M>hY54iv_V-zORon4>=oxJ z5AIlD72P>mEv!sLs--I<#xvy*@Pfs6uo>$8>WyNX%+Qqqe?~R6;ozTbvVo096P#MF z&fOA`#Nc79BJ4vG^bK4?8Sk?x@5vF;NIi!>`{Cd+tys=iSc75(2t)Cu&7SoTBh{cz@}rBu(++9N(4kv)Qjz$D?V z(4&D#)UKNGv(7Djt@UH~2PkY(smJTe)c)X0Lh7ZL5{2sqOaGA;kbec!Jsw8%locB{ zVYFcP@|wF#ctg!EmPF;22mRADb16JFs|u1HO(VQG=Ah|YfIU_E_e54$ zS-}h6L8|P>>yCk)j6|>IvM!7dscASDH-SfWlEenr+jbZIF{ep6aQl~N>mlCo3%NMy#%yaGb__M{lv_xHMvt8HrILxOgbu<`=2C7Xy}uS+B}$2s zLi|B}`uU1gp&9xXUs1h&cwm!$Z*n=2b9GW8k>fKFNLA{ z$~*_c0vOuMOUeE=wLOZc!iyTGIv5MjEg?EycYD$rO)=?emM;E0F@gXhc-SE#3S7i(%c z9jH@wz;Bvm^<%s9b^-zr#X1vy?ARMU3JTStPQc@kb8x0~HY#OeTgYpYT)jWzpxAy! zK6gFCwZj}o1Y;T|f0m>!xv0F^eyly(&*uTw-#q5|#J$OFmX7UIh9bmkB0*VM`I6OO znEsuHc!NMMQ$|;Ho2%xH{H2n%9R_xA*Tc7e_M%O0ja+>p!!9;mrK!tsL+wDJGxKmM zH<32}x<+S6a)pqoZ^@2Mdz;;lj_}Eq`*efsoU45m>yAWaH%T9#cj#`HFsq|p!`@z;lx<}V zM)6Kt8@FX|p(@?-9n}28)EPxgbQ0^*VwB2>;;`+)@#*Ap2j?o!-Qt~7*K4cd;$hIx z!)F--%5!^LB57Dd^ssAB3ANsuqJ1E+-q_chP}+R&)o!*}2g0!$hfOYYjU}WZEn?3@ zNIfHNSrriKXft)(M5pIT_?Vhg_;q6KjrpeMGp$bC(#g))6U);LklTG$a)jSBZu}1wC^u<mw_#B2}_FxF@|@_al{evP_bEu zm7yX5^IThR)3djiV#!*3*U$$oeJzn%Xod1aC|SHy(r?XuWReQ9-hb6RMUS4FIQrHKeUj2rf>(vc5*7&>^iHJKn5nn(-GCR@EgVz;b-K)hP+DOUZ$RrX+4Q#!2 zit;Eo_qNe7?n;IqqUO<4&kkn3>lT1u5;j4~`e4MqZ%pX=^>cS* z;846ociViUjfh7m6pj7)`9TKV;P30$eiiI-SWHy36P&gJ){l{z_s4Xa z&STPX%c>Bfq%37L8Sd9%lTRsj4QxA2^ty+>c+{wk+h~(XW$G~r_qe5*?3&X{nA^99 zi~LK9yq{sXBb`q!;GPKyPF^FEZlPbX9__t}N}+7b@%;?@g0Z_c%IRwdhDF`yZJv!t zWczXFBKto5ZMUh3T7?%JV@+d|aL~&~6g@v8(xUZ1=OHQSe0HdT47J|VrICHrRalZs<*-vhRePa@EPR?5_SbkQk~ zu3A9NSot{lQO3vfcy~qf)Cd*nK6aa>$JGVreyJ2r++A9oKjD`e-^u8> zM;|R*c3ygy6_&~NJ5CIfC1_|PX;2VjSmSPTzYdV;kh&u?bp`${-SQgDyFR>puGC{D z{ZsjK_P852PVPUPCX8+(L($Rl8CBXy%f5SsmjsRZwvMl(dmUIJ7~4+Yp8OM4H~GUV zrfr9j!hwaI(TebDX~B=dat1F=;JHQ@gz5&-R;P0ef25h=l^qnK#|yKe*6y6If3p&y880450lM`66>k9P7upS;LokEnKd}a(qx3udfiO*v7);> z+R6LWJ{NoM887FlA`k+*Gr#T%|2$LJz_#M<2cVQPJKLp@d(qiw!{=n-^u2M!7VpF;3)HlxwjHLdnxTuRj6Z_B_uk zoGl$Ybynh$=__D(22RO2R zQW=7w^H1Dcb&fn>YU;5@!}zd{+JOXW2HdZf%^_tQC}e_nW=?(m(Gt?5)YT6HuR$OhJ$tzD>hS`-jXHW~$F z1?K0zA~N*q{5j(nfc!9H{jH51N;chi+n69UpUaZf3y7K@Hq!(a|KqXlBnz675h#>c zSsik~Z!cS8YU|A61Skn}yU+)tZ$kvRB09wgkn%~U4tN;NNlr7)B7#mwt5@u)} z|4;h{2!TapWT~UNrs$?k=j^`@8{k{;}vmzKE3SZAb88*80Q(VGKI}^FXo2LC62|C&6@2X%QS- zA2OBn#pAkPEe8_SH4Q}k*EYV0NltA{Eua$EyHPV>i<8!sU% zo0XKbKhp|SJI@wcq|Ocy57LaZ1Ydt@dSPtR`@nrDJu56ZL;(NcUmhB;#^+% z{{8{1ja<$FC8Y#K@aW#}9tDh^rAZR9K8lqf4T)DwzAtAq(Vi0tuqAj&MdgkmkVBnZ zn?OIxf16or<8$->#?^QKE$v-nP`Q4gQ5{~pTFdog<#?Vp11Tj)1g2agmap-Gp3XoY zv-R&=@m&?ALBal!&U2-YA;Dh%A?3m&8`tY-*kFyUsjV(nvk2^d{SP8e*vA1E?6-sHw@yESGhhsn8W&p|(G3%*|%NU{e4M zm0i}ifv_(mS@_wTX)hjU$vwWw@#5j#R}P{6)Dkz7cBBvbq{Tg~wwG6Cug0WY?0B&} zKj=#uwqB97?n`@qzjiy|=UaZ-+t)w;d`mUVXzUf!P;;;_?@^jgV5GbDet7&6kx}B$ z?k5*CMmwk23>9KqD$dwYEh_c()3o#AsuZnA%4Tn!TtFb@KVST)qSJ{bB(WzC7pk2t z?XTmIPZya(l4m&F`^D9!>YUEy5=N$1_o;h9gwq#UeJmkHr>3tIUpi~OJdZAEJQJ{3 zeF4AnXQhwYTAf%4cB=`#d>~8H_v1vhPK6|aoRxEdHUzLgji2=p|2Y9SmztE6fN(z! zjjz;BrHL?IY?J%<_M!PaG+Ejkm3)eIsxcX1x1+A%K%u)*>$s5g`5S&@lYTYEGs)&S zm9(Jhmnr08W;y7^aIhel0nyqsR{|Y3Ebdf!&uF~!t{LU^Wvs4j-c5K2;K1My%qX`x zIegTIgH)n_3drsSNoWc}}&(;vduRX~q+KCd`|1FNPzKC05cc1tx%(uVP z;4I+`lh(gG=oU%APkfPmmne%s!TXTO%+X{aQ-&GkVtjhd+_*(Px<42!_`ntDSPBdl z6>oQ{y*Wrhg2{9?YA9)e#K~vDKu`_c3Ts-*I93vy+EwOE?yk|49r^n@|*med-C`gmmrcUd}IM=rL?0T|cZ}PN*N99iuTAY9kImYaa~Lyy zy%uk*b9)h5qs+8wsq>O6h_>eU@;q5OGyl{#bTvDo7Mw_2EhPPY5{pY-s_*KrKYz?!~$$^rbeyXRZRiiOH!673T^T*``lt2;kKkjq5Gsl0Tw_ zEEGGB!8EJt+f(K9pD$IKlpZNWuP9tQHWISx@qG>Y^e+b~p%SPvn?3uMTu%n{lY`uu zzzjo%C-F5JYWK*-JQxMBkPIesbW`DESVWaZ9=*yaWddDLJ`WWHsaN9kA*jkSq-`PT zn`|(^Tw@I;*|-LN20fS>RPjx$Ud!ry<5e<1R@uIfHyhiTi}mJs3Y{z2QcrjxE92Ug zs?=5z*8kAgs%y{O6wbF%i%~6ihs_ai7mVVosGG+GZ5(@u39k7da&x+2`|~BKFnC(W zYZIhc1{$G}D07iDj}d$7iuma5&O%!s6Eiam%b)Y9_;U~5qSk{y{+^DY^@&uWh7$Y7WO=)=QdWb>Uq-FnoQr!m8I9 z+G_c`QOs()!)Xigr5qs^yKXNv&3Ie2!aoQ&^&wP7Grs%@HY6mP z@#CdI+>%7^rre)Z%0iKh-!HJ75nW0Z0sM2FBu<*@72F`%<{x_?A>rj4!2G?S3&=$O zWv!r2*9Qs9df5MlQQX4r?}^X^7yO1u%a--du-?h;%oJ|^6Sqi6UW{h>VQ_V0ciN|P z4kDiYU8#tc3INY1|KL~nmxw0Vc^DJWhZ73I-m+z(r=Ki5`7#kwuh4eK_ogA-woogA zNiAqwtmg0C1;zysY1@e}ySxI!l-d;)!}^h1gRFMb1QOpRx=f&K?APbnmT6z8V_k2P z{=Gww43Favpy7SM@Kf6L#C=WD8-LAWSoZQD#+*BRaXW7=avajK`}ez=qq|iwB)_w^ z{E1n26k-YCdo>#!LUxVR8X9=~AG>>*=%`XA%2~6Hq3N);nvAOj=#bJGdh;`he--N8WqXTEpGMqkqWCMUB3>&b(DS*oB1%1t&^zHJ@%qjV1j2n&a*MVa@_u!9-dK-d9hhcwJ3eg4SrMEnIc-A1ORwdo=NnK3-6@ zsKL3^Z&84A@FgP$Z8E4EhHy%nTX!Cnsj14||DDhIuiE@QkB~NWTGWugR6Z7wVgE8r zLPfLoufCt~{=f8nH3Y~qB5y0$aYJS3y3L&+2Q}do_{;QxhQ`e52%-NJ^YLmW5T%(Z zo;De{&5VUa9s<=$*EKE3{t?Q@Td(;sV8xz_sg3_gNjX4}yH4ht12XrRrh)?9Z(tvGe7L&6KtzfCnGv2+ z6msSlzxqJMQpOpLVY3Pzvnm^}u0rY`nAtCKTNs#4CZeSG&c{bySup(Fd$(UZj^BIb zaO*Cmhb0cO_?SIa23Ucm|Uu47ir@Uu}~ZVj)A} z%tXn$ZwP#V#T)=Wx*%0o(Q;Lux47xgeqHuPri*up(7_iGz^D%;BDeXBD)0Qm?hmSV zcNlW_-PqXpr!;m&u2UBUbn}QefFbRD35dexTiU}NM#cJ*n50>I&}6t-z!cN%W+zL!fOV^uFgn&mnL(|MrrX5&jdh*O!{M!gsB%Q8|n=7Q>1`XY~H zZvV5ny2iS7+-H+`N9EqGzP`Tkdh?O}Q#CzlZE}0Of;?BQDHQGirs@{btcvwFi z&nPGK}z#UjEO1K507R{xv0%|Ew$Y|7l%Rrf|o(rkNXmm86OL2>k1$ zG8Zl*|4RQwYilmr)uZgqxVz@5)^N+4`K)GxbgNp_)w2KmZ&w`#S5lX#Zp!5-uJZCf z(=B_x4S{0fIt~S#>uI=e{JR`cnQHJI(1V$BbU4$hLY?0lxCHc#f?wHxT z%eHR+yG#*qPN>!~2&f~<+(pe1PDaL5@%+GFW@7vQY(E=K0jHhi9+BTMDr^IyZUFu! z(!1ZR552_MU5NTV7bU z&T)NxJCDO3>HyKA@4)_1i8CWiqcY;Xoq=+n!`3ivOL8i@+OB%(<2*JtEC`MDnU61K zy3?L>c3gQ9q=-^AF&K5&*8#*kE}SgP>oGAOlQVG)-+&SCJ^Wr!-mG;H@rIP#+RN3- zwdG3OBK(8QtbOyFW}3SbmB#MHbM6N>ErtVJ^}6Q{KOic8jAQRP>n1k89IG7;)CoKg ztSI$nX=m6&(VBdvSS`^)QI*oH)cHat+#J_mug~&tM!X4%DE%#e`{+c{-oRMQdk_B^ zxLvcAxIR(!wm(kv3TE`~%$_Q?$u&@nzvZU3dVXLvaQguV&Wm$nPN>3D`8tWFO~Ee= z8gJ`3GB%r>X-eR$%li-|Q6*s1rk~_uXVj9$L<$$H3C`{b$RcluoUpR{(5gi3vv-z1 zQ{$Pa_)NxwhwtfA3ro+07dXO%bPfm(-O`!w7MfXUW|hS( zrO5TDX-9f11g0XpnXAML?H6hq~i zfiQKi8>Bl5hd8yE)w0leIys4Sd>wYgNCAJ=g1BR?K2$JYeR&j<&0&D19{|tn4K=dX zrxFu|NrY)Hp@MO_q@~DqSgC0Qmq($`=!U@$V#f65mkKdOe0MYtW0}08AtXvR zhCPM`Wh8i^PJ@jONpKJt0Mme$60?g+8<0VHU_rKHj+DMFs`)j8Q@pzA-DWm@R2Dx%KBnKZQ~|V#?wjpP9a_MoeV+9 zg-Zdi_vIl>5Zc#E2`$#nREPcCs8o_YZ#bPGy>afi=xpKYs2Ur*8f4|^%XYVN^V6+N zqDh=sU*xaqeY1_|E<|r#9s4?naeu(6Bz(ggoSIMiG^4-}BK<-tp^+!B_!%+&uMz#r zXO-*jx1VKQK1Jrb3}PD2-PaEHX`7X>-n!oPDTlbvlX`bb&!0{v`!sh7eDk8(4lwGL zI6NwNiSS_F7O|W63ntCBt_-F=2l}GmGgBTH*oir72kHYmF6vX05(};H0L0xn7N3T= zZ|jBr&Kc*hwfkqrzIOWI!R~mCj3xo|6?b$R=XG z&U2>|fx{16V*#_?a$(%*BUXJqc-vW;rimc#q%hJzl+!5X6%U3K=I0r4f(ywaXCJuA z#=poM{H#9vP{KeLUC7s3msrc;<#twmR%RshyXje&STLhTyF-rJs9{~0Jn`#8wx#|7 z6*SJTgxqm+Qo9WzTI4m4HjxEs{ifKKNoS;cZ{B7RJmT1PL)~De^Z|?Mkx}V=R-W9W zQ3{-zpr1LNGR|b%_nAw8PEuse26%L_ruJwl{->j?CW4;R)g%^fm0w(FhZ%jo6z|K2 zU0>l?B2@RbZ;6SXwKq$T=QDgCz%)Oa2z`lo7vS#fFJ9zvah6iKAY=-uerUOCg8TrW z(myK`(6Q=$zt&atcIsE{c4TAMJufs@w{-w6y4GwTN0Bb6ZsVX+qFvMP~M9fssws%1=3XwuZ=vX_EFP}Z3&d=mBKIn zC>!aGfL-IL$dtN++$=!Yo!$#|5T^?m?LC)RJ7_4c9fyGQnV@!Fniis=yB(hwCe-*g zQs+U~L4>E_h$6URj^lev-Xvr;L3dqEcqy&DA#hr>K?$7&E(<+HZFfSn4_oyWb?xxf zf}pG$5u3cMC9MqkU$|Dc-6C>L1sqbW?B-;mK^lis^R9D^YQjf3pibUOIxXO1@q61b zpOqZ@9aojkjbv%!8j9Iso8wS~GZO6|#p7|6v z#RYFJM+Y_bE(U{@K5yRx(?omOr#shc_K5IA@D{@k`W@Y;Iub~#{p@Dpv?RKMB@iS! zE+VKRi9P=cV2Y^@$VbEb-b=l=UdPre)(8%QhEZ4RcaIlAeS!{ks|=sGvT3-M4bqEO z6>KHPM!I|e!sZR!-kW2+$s4dK3Gqn{?njbYjtr19pN#>T9ce}pXQ-mpM)D`$<8v0K zF`D-@8ccnClhUZgG$sOHS6>%fw{#KcFhJ4Q4Xf;&RsY@ky(4!EUwT*m`y@n74`y&@ z$CtLeYN=_V5-5wZUND*S9r@7LhAlBwX}j3*NF(sAVv<~c6&rZpTQX1TF3sTW5D}Gj z-m~kAznLLiclcGsreop2nqo&KMHf1gC>FCg#_}ek3jD*dmgC)r0B`pwBy8qrtwhc! zh*Hu%v?w9YFq0}nB5hTwV&BpBIt(e>@AYb2V33sfaIu$kYB42Y9}aUrh^tvYpPDM9-OU{D2@r^GQK@oG>w&Vg_xdr zmz~cfxDG{Lt11|4&Q8dl8Pt#$Wms>L_z`+?+AzhZvxOxbFM2(A#_rYprJrDmc7uh| z?h#@>OUPLeGpg}M?65a`xWbgVyKG4xh{mp`V_M2#6UkbJfG1u=de&_vkH{sZD1|qQ z_$TbWQ}-$D9;MJo&)856%QzXEx##dprDTF>-2IcrQ-C@=)!v2Rn^ zlddi9Ukwk1}CK6@S-m>%p+KZ_NH%wwFF#EjRxFUbiVX;p}yfUr`209vOCoV z1B37k9WBeLzbck6O+SV$$KPhAI6f^>c!1krb|j}Je|+By7A-ig3NbxxG6KCBT}^4F zgRpr4VOu=OYlOkd%2;-Kw_{KD?YtXk*JS(h8O4#7e8(uKW$$xOUP}&0>AUf`lJywQ z!D4noxo;E)Gb5cvGT5tPhdHYM6J(W_Vr%Pt4Zi}*?Y1c{=MQf6ITP4x!T=gIXbB|h zVx1zmhP{g&0^X<%pGu8xTFXBlg|AS)tXjp@ww@Mnu>}?nTDGx0Ez7gp&5paKR*bQj zD&$%S<)J^^m@RF46zdDd?m|#0b8%<}{*1jt#Pme0ZV^^ESmQS+7)bliuZFhTH+wp4kRx{JpG(tfR zkud4r_v@8GE3>t*bS;$>96vKwLMv{}+X7`$<4Db;eT_OMnT=WV1qK&CmN|=rmVyCVcH*cE_ zhTSc!R_qt$i!T2y^SR&#A2p|FY!1&vTFQz@X&>bQf*?ivh$bjEiVhIFL+C8009xJv zP%Ea^rHoUZm+h!`qrYaeLRvb`%M((7d{hcv#W_l{XFra_31p(L9^d2^2mmZ9hj8+8 z;y8Uv?+u5)v5UQKdDtc#Vkf{|Ysi;gAsT2bpRn1NTaXvM;q42;5eCUYv-(4QBOj~d zCa~GlY69#rJ*cdzFO-rEkv_!_^`{shrfxylu!al9Xiww9u;19^LfrA_rx8rhw2UxE z=mw#2&KRvk1bgj=lzi1sUYi3Y{N8G2VVSCqt7mhz!|nE)X9Fn*@XSJ#~}xr*Z}V_ z46`(a&l;toc=my4M-8&dc<|cf{%mB1NW>9dC{6am?ERf zsD?wxu`P0LS`*GX_&c5+wvJmAGTC5>jjm(SyVY_^5YbR9>$CmOHye z@|!V*&KJQW95Z@k;}{VLrJo(nY18w`oI0zM@2~#`aABanH?127EAa-3-r^>i)_&Ug zI>Ez%vz)us&oDtd%wKn~Z=1pme0E4ox_+D0nhxV4=WsUT-|?j)({3Sfi0Okj&jKyA zf+*@%^@iBlXx3@ya0GqTAE7rK#Oa+wT@3n9>fUISGv`6zXaE`2h`GsA%g^8?&mUju zzbdsP&`r=xH3z$7c@z|`Zz{WZ&exe>z21AUuHCC9TzBZ~8apJad_dzW-Aj)Bq2QiZ zI!Hl-Mw2kkx|U~tk5fz{0Yx#F-nOllv4*?73&iuI&YNpLdrTBOF+rA5Sw`+$)QYV<;-xztjE(ht zbU1yu4w9x7iYjYwDO4NOAcm8$1B(kw|JGATGmtW-^cr_14zuc^Bnw{0VJFR2gHU%o{xM$qW-Ma9~x9~X|`?f>_fQzZ*y{RHd4sQy!^NE1aHUdbK0TTYjm2jFr z76IaMRx`c!aR76v421u_*4n&kzWF!;NE2HZ)jR3(3RMuCBrBsi9c90QR_J10L1WYn z&5h?+_n+h(gUMbEdnSV5Q;@WoSCkBcFM@9lHc%$m8xG{Q?Y@!v#{DSw#AD`Hf{~Vz z-W$VjrP-&UqTSUj<}joZhEvJz)`Acle5e<$B+Qh!y{=|ASjg^8qYC41IpTeb)L&ihxrb7M!zRU*yR=%?YCDzB%ugW}`oszR; za7iD@YqiaSX=twdq6tb6hW8d)`?iu~4$YUL^;{N-g+K|fu=cNBO_~BYLI5Q}*$sL| zsMKOR4THIR6CF|&YIH0eQ?%7Jl1gXXFcp9%CtgQNTf_(BFzm7sM;(Sf+MaKHF7Wj7 z?o2gi2Kw&$ZDqN_=;b9{^Bxw|Mafo-{rZGa(z^E@dKha70}gYbM^ktn0Q7zMVY1A1 zvX!!vvaR~WBIrDff`%5N%;V~-1Y+4yK3&@1c{S$^>sio+ra?Ztmrla(g)Nc^S^FHF zdHd2!I4cmUAHibIz9#SP-k`gZ8BTr5o#uJcEojZmA|G9xkD^N_|(p?!P%!K|tf zbSWJHZ)&2Wu_PX~qt@jyLvza`&~eRo=g{9?sWYSgg!Y(h*dwa6jL*Hl$7sR@iZV_~ zc$D^(N5*%Adkn55GF9E}web2AhDyr@C&34(FI}EH2UPq3tl>^z09f7kqn@8fyev{K zzLh_xOl{j+rB30n6GCPLX=;*W>~Nu}iWETt++N)qxG7~+K$Y?O=sX=XGf-u*d3Z(L zT7PoPw9A&vIee$sq=iELEIp0pK}k9!sy92qZ&dcM<`@wE42W&`BGSkq!Szi1*^XZs zdMBe{V^?9z$9=k=odw~r`+KInpDMvekk8^^=t6o%$R7vj+y~%C+pd|w8o5gP$cC-f zG3MfyFjl8CAtCDPjj)-}CK%G7TcFeYjBs&%n%R7fY7k-o_Rea40FUm7-IlCd+Xnu;i37wk=^<8<16I9pPd0Q?%>Wz=-CL&t4|r}Z*vj_7{C$EWI33r z^Lq&yb34AKl>vx|;kNCON|ZUj0;zSB?@I4+$Sf%b3DqS%ILoY*$3nOsX?T{8XY206 zQB2`kPlk_K(zX`dc5*vu@&MQBVexoBpX_!%Qy1RsdTY4QSo2*Pjm<=f{VCbg0{E-r z?Kx;Hm`^LQ+C_17brQvOD(fR;7d0;$KTx&vNOp`%r>R!w!mbr$r>ge*j1y%q=Ac8mboTOkS|Qw-VV{{vfkagh%iSDqjcrOXPE@pv}DttBW#aA zAAl#iN4H`NxO+^ER^~t+AiTCmkR5qZXJH()G9ARyi`bq?GC!)$PL)%coqN73F~4&$ z!kd*D*1yACW6AI3F!7w-YV~R;NYZ(<4_oL{!p}W$Hi#jp)-`9HGVA(`FPB~yVT=S_ z99}dfOG&=+d7>DKS%?jRrWc#4`ADsdSzixb-fr~COAelaXto~jD ztDloN`7XzKd9vKVo?sRfj|`)9UE6P!x~}WhUnkm69ZjU|nNFYCRYsaqjJF*%HE>|9pQlr6cM0_N$g7J`lFbI z6aHwvmLn{bRx)m<8JjedEpL<7Z!Et0>tB2Baiuz=n5EE_ ztF5i??#wE^ZcTpr7M0v8c1&gvJtJyXj*+=U1Uc+s(qMP^oqKYt_G%thn*fPCrJ!5i zne+Cwect`tjRIttmprIDZ(7$A0rA5YlBJJ(=i;_^Qa-dB1j#s6=S-4=lNAlVq8yFm zgIl*`Zte=Du(QB*5XKLE=SD72(Yld|s08bWV_Wi`CwJSIUkMuruao*@-indV*NZ|l zs?!>1VsGw~pdM3@)LpKF2XRlMKD^R>*M69l#qo?_K=bP%y0#kY}hNV(G< zYvmSMAFW#vrE_k1$9J+nDYnMOa#hxY%tjEeOm!7t(=wMaS;f(`>J2SM(}`?lURcjr zuAc7om=;sFDGBd5gE^myle}m@AmA!8i`H>|ApMI|3TSJ0kcRv@t+>y^v|Lb2c9@@^ zpF$Y5Gc8Hf1E$$>pEpCCvdxrs!FuEidY((Y_}fQ5fDNt1m;Hv)3k9=h>9UawwP)j0 z-shCXG%YFE4Ke)r;;Kq53%L{h643j5*e=t5;M4zwpNp^r9J>-(jQgg>bVIF_ zo%jCvbfbl$`X6M6gycx!>llV(tUq1aJI^OGuGV4BdgvVm z$IXBKOM)sG!l3PmwfVkTJso3>TL^1;1coa>%uwK1c1hsy>-~RuxcgB54>&LGu>YlL zhF#(?{cF+1CyR?hHwe^s|5v%}OdLP1`-)`z67zJE@2dIG_R>T~V@I$S{l93|i;sy| zLb<)r3HZZYA-+RgMeN&3>T{Og8F~c($eGh2bIb}tOietd7F0dMz!f_eW#s-pl!<`2 zQ+p4PsUgZFK}X;BHNO)QSeA%|ocjBgCLhY)Uo%?AtSU;&5>DpY6p=5?_Dj+aM?*t0 z81{Uw{|lR44Nd{hNpMy`dlr~5=IwVPnT1{2y0Ah9J}@LeU>$dp31hi!{BpzRuwTtU z!!Z{6R;Uv%ewNPJ|I>7jQexJu<$&&g_$dO)*1db%&a5RMAeYYv5cc-WP~T#2E9JZK zy4-*lDYK9=$LPMz29~MVs;*CxeEcOPN!9Gu7vCc>H0}Ro$p{`4VPyLnJAIUu)}TJ? zqCdAA`vXT<2B2gL4`%4NopbxF4`JqK(}&06-ec{7eH#ZHUWYpXDeg^X_VoV$8vRHF zFgT!)JMEmmc%!)|)iCBMS1nNFST?s$2w##sTe&v?XB>t|xjXeM@0TQ>wia=N==UD1 z^rqk=F5A;fy8Vxa>PkU#Vkl5h@XJcEP1pZ*J}WL8xYKE<1+30_C!UUDpz}4{_2DyT zLLv)>u~SWKp2NEz1(67PZ0U44yWX{Rq9_m_SJ@K>`Xkj zoT0S9DdCk`r}yUWPE$Oq6PC(*6%GzMPwl!FAWeOkW9}Ws==um>s(E z-_lnhGuQvsrRK|zz}opvt_+T(KF#sn`1FTE7#j5@@if$f2lOdF(ti0#S@%T?(L|`R z+*1-idwxgvHgCFkj2u&LQ=$Ihyq3e#E~#5 z=Yh(t*{0YMIduI*;IKw$#iFD%bP-O3Rb88fZfE?cm-pVbw4V{MsC04paDr_zlbBH~ z-A82&1xcxG9bhEXnhll+kDB;acE0F%9eD9`CM|Aa9;V0zQb&>-5?YaEeo3BDGS9FNGcgLVs5zJz)(fMKYGHG&EiNa zu=S<+Yw@kTnp9&G2D6P6r@`GUjvmAT@nGr9)nCkC;Em{*y<{fx= zK9%B1M4cvEdla^O(O|6mfokf{)=H&{%F4qM!g1864V+Hr6;R`LAk9fhuW0|}{D>ik zx;MlmcO3ickU4pge2d1S*oV8vQ1~$$0L?6G}l9< zIzTG6Jl7%?19y}$$BQ>FN1R%MMp5O<*dD<&O zxMj&M6JqMb3+@OLp+B!%sVmWm9NXbLXNJ@p-*oBNm3QpW@&tAIXTlhTTzV!FD&%@}enNFn}8>ib|8faQ!w%&26ruWn2wQ9ii zvrv6%`n83^W^SSOxn;!e6X~X#h=s;C%}gGub50ZS;(9zt=EvzOFt0OldB77ntI zyQ@iwwEjjfdB#SJF^3p*SXEZPO_claT3benhaIK{8e)Qv4~jPIcWJPy>ku#y6X#&%=s;bb!2-pEy zoyWHr)Ml}y1L2)RS-H(aY;E)RH`;-Y=xy+O=^$JD*Z|{bHJV`C9!j1c&eK!uB+Dqv zQ_?>Y;CkJSoPume=51H9Tp*P?aS0HtLAxEP2g6O?SdU-L9rd8GwyD>W(98ARt^p16SS zj~aKhgZw^9W?>*IHaqKjK*t5{j7cmQ5K+y?DmIHxI6OEk6dWr;>qSk?4kNf=gpLSS zwj?E)w7RJ9`kn9Ol;M{C<{lU?byuhtn z=1vaiV1qK$d76z;TaAG~z(bhsJJ;`3UV#f}vt)O#`47@Tc7I0^Zfuxul4$m%+9LG| zqLXZo|F@_&^ijF@#g{2Ao;}N^vr{6N!LBA(ee`ZJj_>*ioT&`1brW$G^voKJ59vMd z`lJ*wMe4(p!d>;gQ=2-Wyl1HR@LYAfB=#w4%SQEr3>B=u7~kaRHkVr3WmJ4!TiU^! zOo&+H+E{rVM1+%f0x8B94hvX~^Ts-oX20eF8)cCqONU>0HL9b|2u-`7IhjBjM?eSQ zU`uDFSn?MPYJv6T+7yjx`cnNn<-EE$+VySFd8}nOnURg|bndJj1n{6IcynyMl`Dp{ zW=$m|49^APV&tEc=gIfNuxj0R4(?Tc64KGFce@q~9+k8l|IJz(7Nf*qs;CKWifF2b zBrc*&ees7r_`^y~z<00TyC*jM04k%4(TU;;oLQdOZwzu3>a3BQ0zwa$nLoB)U{!+V zuAdjPIbJOK-;`AMWYoH@kKFc_yVuI4li<784jh?;EJ*trLiHm%@4MpQgO&ygvqSF< z@p|IerX|HH_jN=3Qypz&9wW{)CrS@+_Ne z1FSYBt&3RUw#R#wGhf$Vw{t-S%M911jZrant}Qa;-`=DY0e72m54Ya2P&N(r`UivU z@9cEmo@($hR>cEjMdM2v@kYc>MgW3KDWG5XDWGx4r3N-C4ki8wDA6C0vaWa z)6UksamXN>T1uk^f|zxHEw;LU#(lLw*=V0c2di=V4O=5&KBn!Ya`Zl;oa?`T=5l9< z-0;eFtY{}CU#$K5WES?gSY@MZa2Wj!Lr&$;6HX+VJUtDYjxK~KDQe6VdF1jA*R$iU z1SBTBI*noSvOzkS-2EI@uj1=-&Nrif!e&|R+6m1#0-yP+s`rtt88kCfBOk2xGnkz8 z72X6|rv)r&TjllJrJTL4KG%|@Lc#=mjZ%POjZ`~BUh-yb;m#UO2qy&o*e;LXb`!+z z0D&GhE;R=#Ng_(UQ6I<^DU`>R7C-W=9(nCkvlyN1q_8nN)LKOe*&cj16D#K*N~qXm zmKkwAiF+Dg>Gfzn%^ws2q~%@o+ntMOjVNbs;}|2 zfgDWFt2_qrXL50(JTmpgpyA*t8BjNcAM?HY&rS!MxW!`w4ZMZjP5LUt#GMD}=g~4k z7VFH&NCRhh2>RhDY#2V{2MuyB-5Ja7C+C&+*c-W5w156hXZtC)*IxZ1YM>s0MKqz2 z4ewJXKN5rcP@dso&KhnZC+vL2)XVq&gkAXg*!o%#MUjHcuo-yh5>gL&#%9#-d=a>_ zjoIJ${@~t(&1s3z?esY;Ox(Pe8JSf?cjZl^*3EjGqc3VnMAB#H6!*p~jh}F#RguNU zJE$miWt!;bh&kgma!=PB0SFt0{d{B;#}FQte+P5T-DGBowf)s<6&`V(H(2MqG*`(< z=uM}nG1|dC&!!Cn@+rs-9>)%yMekl`;e9=xqvXC4l8Y1Ime^~^YObm0GBi~aRac=)wH^_3`=%iLjWQTs=-A7%#@$I#jVMcHYke4w9 z%_FrP=I;P_CItDu_HbIn7`yEPLfz?N+z`}umiCRDQKy*lZhA7w2;R%v+^Bmjj+EG z1i7wOUNBW|6(pPleqtMMT|%mqkr4+=VwF%{pNsmTqnK+960@LvyJ+c?<`h2hnH{0* zUV!T&C)=bNxcjhj>$Rz#t5RNYB;fgLBL<6&*A{K5yL#{`niknxQ4UN8bJjbJkG_a( z5>NRJ8`|UdbGkb@Esgv?I86e8D2KI7&YNi|_!9T#-8U;Nk_7d=&Jn7uWZa2Pm7Pr? zdUzB*!3YvAbN`%_QePJkq}arh-~TLNBzljGf){3F#K6w!ZJzPTL1>_919yPPA&p}+ z{C+$|fHpWTldB=VAk7D2R4x*AGMFC?s&dl2slQL70LC80@5E+Dnvo-RMyf0-Wp0S2 zOFwS@8jGpNO62ta>WVS3MyL^D_O-Euz3L2f{ElKv!-eq!9ZCCScSpt_BgSG_E@#4X%C-zyy`={vh8i9luErW*0YGdwLq0 zTg&xtC9^lV_2k|l)2-rhoLh^LtP?^WST98zV72@8AZy=|b%h)@i{k}Q$6rH1PK^OXgTF3zS)0i`Y8U@+J4fKL9Lea&B``D zfV4-;CeA$UTh)<``8%v1vg`trP1ZJrP8yd)VIJ6uYnhmQ5L_{0Z1T9ypAHb=IgZ}ysa;`0UQ!`qUCT@$=vp( zlXw)$&K^e&MVFUFj##GKE2Y=ETRPZT{RBC7Pdy5)iSfqPRr<=J`1TlcEB*M`5FWq3P8VpZTK*UI0BAAcl8ZkIK- z>N?EqQ1-7~Dy%R4)pz!|t@+mDS4)=Kun(rc07_I=rO6i_P|H3&5eV{wvE;kfSfB?^ zd)<)Le?H1nz1LUwqHh?4!-16b8-?}Bd&b=@c3*UYgta{ z*uywzoO&e5R9zDd;N~5ddfTyuc0=Z{lA~wE48(BBh3!J^B2jL|ITl#PHSllALt-tB zy&kBAYiQ!gTLCF!32kTjW>nKIE(f(-`8o;zP8MEEve%f+NHM7RHSAwXYzKe=JWmRa z=`Quq3Q+08ZBMFbY>BfekJ!um(*7AQx%)0v+S?uD9yLc*HH@)*gzkO;Pneq%V>)KT zLM#O*jQ*+o{3LzDB$sRaeGp^Gg??HEr6A&(c{hvqbj}NayW|-G-%J2RTN!&2cL~jv?L27G#3t?w` zD-Dtw6sN!1Yz$97u7c?KXO_SY>WJ2yHw* z7{DZaug@6qaICEm`j7qq=FoExli@RXdb~aL%@u-Q$#7#KLBhB{|1ApalCFWh8`p4$ zi+VT9x(D{=>c*M}@;+s)e*@-!bkp`}V_OD$*>k*-NMXK?eS2`Yr+76%sqBX{)r%K? zhM;n}I&FPQ-3nKQVb^=iS^<}S+3?1cL~8}cTz-94YLFo)C`lKc`OTbyjM?kT#T_~NlZ;*~_Et4j)cG-hsahYJR(?0s^ysXJm^gpp1wZAefCbaf>0LLy zg*a@`t^TqI_!V;%_Z?QJMJCN;ARf>duWrM+{yl^zH#1-Ed5MZ^QW__jsDa}0+y5)s zGPG&(R2BEaT6WT)$4%tysh7g7r}x|dq!snL&y(1kOxH0Bh^wY_Q}T<6+Ak7rY{vwV zQn^wo_XL9$=#CWLDA*P60Cn{;L6?xTjrHC-Xn00k9JW_%t|vvTKiHWwbGq<$TOh~@ z*;PcXoA~JpDLq31Q&I4}1|GoP?4KU_(;vkA$YE#be~UY=9e!!~VG&F)?RuO9X&WNG z6d_+Uun_11ZhbJk)SF>oRmdHg%3eFkiGze3iT21M9isb+Rt`6@rf^K2EG=#5#jQ1P zTW-`-1dw9aDNpr2H>IBmeE9PKl@B#>MC-2bQ4t#7yMt!sfvf~V`@&1huSnMJNI%6j zmUqiuMq>=@&Kh_Py^^QD{NjyPUKk%(XiycyHrOg7I4Z1{H%#GSsxw@T&_PVmaJ6Bp zp1O^Lgh{ft-OTi@7eP*j(qpNSb^>eQ&m`3@Nw2pA-{h+Poj~9vwl4fLJV2Z^7;6ql zdE_4uVdASex0}#K?AjsG`}#CYmvtBnB&<-1qa5TZClhkY$E zil59kS=0x32?lL(5*Py$btnW_vA0&mo zBoatCbP@I{;i1^Fj0$hw;_m*T{wwYpYnXh{_x5BSE=zDlP?wxj;y=UKAAN~RAj7wl zuMfFmPru&0sqzT7LnkCVa82N=4!rqE_E&wl%9;G7p%4CXmU$glZ3PJlzaB(b46&vL zZxYqZ68^rbaWB&8*qyxaU!YlYMk%RwO} zRgg5Ql-rcKwH%K+6}*?{H_9Kxo>xnc(MNn)FSvQ%?Z&#)zSFJSAyUOh79-8vk4SIO z)kuu)^M7D#Oz8f>{7O+XO0PLQnMRJ2i%ZTXCg^fwm}YbM#$an{LEUr1pW~$#&%}c) zh4**0t_G;#7UUYOf41_Ax{X9;T9hJrn&aY<(?qz5%>JP8A@&;>MBJuesF~)Lhs@98 zC>y|x6~cJ7odb$Bu%VIBZ-{Bc+gCHi%-wALhlaMouiAu}*l-O}{?QEs{*byS!j|J3 zOFZMv1tCsjfa`~M1uySd=F>ka;pDJ?LK&SjNv)j?F`R)EJ^#a!IMZZY`#$hh8`t={ zG?|EzVgyf=UQVIeElslmwg)TpICZ&hN){fgcDOz7 z**i9L?;>Gs7IgOFan$Brnjg|mO!K$9T91AZPfNPCZ;FJ-@9pKk zh{#J-y+Mrla20WkdqCJ?m}0@$HgZgnR`>D$1U4!p^YZ}=6?Gvx!v2r2KW2WUitHys zF&9NQwW7;V3Br8GEeaMv8N^Xg6UnNv&sF&CF~&Qk#IZ!brY=tVFXL{)gQD#=c=QOP zNOg^KD5&;j*)gt1D>)~!W^8<@`l#4Ak~y!1+p4!=GU&6g#jz^j&8@(Ce{Y!I;VaYm ztfMr_+xeMC@27n+=Nsv~A#I|MmHy=}?)$GjEjZ0~;zY4r%Yc{3a2lNn&7GZDR`XwZ zm2EPACgspxhAGL};yP9OxGIS`8yexQSD#i=i^N}5(M-KB98;y)7I!7#BexL^Id-Ya}8T94O;;tkFn-srdU6~6j>d&{*0Xc znMZA0X1TP1YtvGEZrv!TQ>Nixc?F|z*kVmnbW16;}<*T97XWIC&lOT2h^>qEn*5<8b^; zkQP-?-TT9iMApv){eolM-QGkrZv=3aQ{exr?91b!Y}>F)NonyYrEK-smqIdRPZ;|; zgX}4iv6bD}q9pq=G$C7qG1g=shDw$}gt2d7Y%|tj?8|qn=ly!#_xJtt{mVV~ecktY zUe|SA$9Wv*Nt_49Al0^V-YE|!u2oR4e-?xigHOwn+Oeo4A2h2d@SUCCDX9M)nM7jaXZlJIzY3EM=g`; z6knY+r}y2QI9cOPiS|-$r=<@o_V!G?9tkj-u z`@d7v{+46is$7*~B`MV=%-h2Ldc=-$sSHg%jaD;4Zt(~a*2)#H!#wW0&yKPLZiU$R z4>Ok~zjxJkN?c-kv)nKe@O@uy)&E`Fu|Mx$*IAq{>-TInnRW`rDdRbJJHSFGZekNq zl1UqdpJ4u%s}%Gz2wxj0fhaErP0hG;NHY%*uou>)`Gx-F_eX2Q4{}Dq$6hkCu(|g> zwVzLSMt2Swo18pU^?a&KoQiG^u5cRmobPTNIGVV}a*uudib(+6e$XH(%2GTV|WcZge+Mz4(x#dHmcH z&_9tlPr)-a(z|al;=r~vE&At=g6Wo$65>v~8;ju6P^UlR{u}ey(F|Ci5>NcOHltrL z`yVBw;u#?}7x?~neEn5LMa5R4gzl(&d4v9bQU7j{oFDB$9Y($Q#OL2B&l~*KAyfI5 z3b>+%<)XZC*M*tLG8F}RPwiCQ+5L+H*QG)%>1=8Le1CZowZ|bKH_#&jFNFp7OOB-m zJQ$w>WSbcU|E!pLU+J4w0pagrswso}(7RHvt}1ob_w%(L-2?N?LF6NCC?LB$`Z&M+ znd&skD$Oxh_K;NX?0GjW%u=d)+9k7JQRVob$=KadTx?P$HvM!)3;3AN|LaN47WGR* zE6C4)JoaDr9b1Q&ei6_?udN8I&Vze4t&0NfC|~YJ&+z@vP*W`J%u5$YoBcJ7c4_^o z2f%vY3dGMx<2wo1rFPz9>X7pHGh8&4{Ni`A^d9hrXv(~YeOA9V$AezLX#ctR|7}Es zCEe#M|Gwzz@D;#X)BosrkE}K4A>&%E6WAwR+%3#9j7%vV#>%x@&0@BjvR=NvX^#Y72!{SY3%jJ&Gbxqf={+TuRis``Hb4Mb2D<52d zaCQIVe%U)VlC;^D^;>Phfuo*15!NNc3^t3F6vz~;{P6a&sA~PiggNRr<==&SK4#oD zx;wVM^D~==rGVdMmXg%4`>K-Ryy55pM3IUus%OXIWSdqP_c?kkmva2~GdvTO@(;r+ zc*mc)YT2iS_^y_Or1uNzm){S!+SeQB=9>Gfhfq0kn7k`nZdjbpQHg8ht2`I58#L6* zpER7j=jDk-4m$sh)xPRBv+@3olVM@U;iPW(L;N1r$ZsMzPF=t6opFGN9r4K+XNU7I zFIHaA#Ds%cwFJA9vHR+d|C+GMmiB~ym} z&}fi!$tT$@s;?ze#i{?jdjdpe-h_`FJo*DSv~97UE=I(bY&0e%mHDmIFX1*0KX}oj zk79x?KxZi#D!WCk9qnkp#Wjwt-Z{%9w~^<$3YE8=1$UIVHR%Z1NvMirE4HilISWYC zi^_`Tx83RQ*!iz2M+BKs^DHj_)i>~?Slq!vsZo$Ybpc+9VfAru#`OTvMZv;so%8^& zQEUQ~>@{x7K>HN&zDyIm=KTESsSs$s5$`nSCfM)_d&c7-!+?q#g5hp#gBXN8G7!Aq zJD29Gr6b1j5I0E=L1M>ciQ{r7wm3N#=_^ zX5Zoab$W}hI4oB%eLsB{t2l%k;a62YS`Em|nIO%Xug35Hs5l5TpjLOn_ifC{LsS{3 zpP{t3NBu`-dRm``={!FmcoB)!sg@%0B|D+MwemL-6w=n=$i71IsNY(cVZK&Ce&YCO zgiAZ=mJj(`7!hysNf};iHMll8`99(bDBx$%vEqa6)l~vZp{0NMjlUJCJ-nmYevbTN zu-r;3?=Qr2BL(LTpD(lzl@n+oHC~$mDK{B*iwuPjGb^2Hs94Uh{cSshg7wxj_zq=^ z3U#qQktd0kHz`|=(ZJOjX_k3D499$j3~*^MEOUs?xj z38(o@oBz={c(h$)-b9TEjKbgb-O%IjLHp0kt{PD6Ti6*R%l56c`9T-K_l z-K)!-a_Mc4!;}x(vuO4uF7j01bUR(v)gHPgN5Zr_1+$)H;Vq{5G-}OW_$z8_@N9DD z_}?a*h{|(*u-@NsMSRMrL!?v~@jgyVt5kJgcret*UoVu_>sWjhX-(Yn&fY0dIV*-J zg&K9O!(Yr`h|^wS!o5$|OUz!jKbSZ|nxX;3kQvtzj0-@Q(>2#l#*-g;cvHa^67yvJ zZ|zmfaEqJJ+h6&nO#88`5slzDVMR<|!yDDJ(ki3RF8`b?(e4VY&VDlWro7J9Jm3LU zI&}|hpGao0ngM%~m<$R{zq5em4g^yL$3)oNV-8mmjrmzH*DXsjb_8t2=sz-Lw1ubH zobf9`-5e@&#M8w;LucL9GUg0d5~y9-n!2_&Q-b&oKW``pyX&#D9?B|_<<4(X#AVi_ zu$MWEv})BxY;%eXc)zth9I585$5)-58_&$lgmMX<6R8$(Qo=9ATGu)KmC_tlb68Zv z|6>Cc)8aB*pBBlXV^fOIZ*>K0=nm^|=A>wycgAVwarBIJqzCHQ-eB;s4e$fxgD8Dm zic1czd#aINEc;$VJ8`q2U@Ek|nN_qgb13P(W1mem`l`)V;K6IfJv70Ow+1?n7ysDubue>Ba49cp56_t7a0MS0Ouo^#iAbTkl67tfzE z5uo&_-B8%qw5GI7@J&1_wMt{o8l65(eA>ro>lE1gc!+GT9H);k7|!D`LtTpPM9%0c zXww^}nUF3ku{%NooG%Tv@rhisK;|AxVBbCy@VLRBG*3X8wxvyL%Nsp{UFof29P^#$ z(Wnj_u2^4=(3SmC;}}sGox2ivXf~sncv))xqiVAKIXmG8_n!Afvoxm2rgKUb=J3s* z+7&Rtj>(VZGWz7IeQGPelVlxL?8hwHPNJMou0%&prf@Z4`m>kwJCc+3)O z<9?dG<>jl4(7@`pK7LS<%om3>;`DvaP#&*qiBTPJXSwp=$by_9J$XwDA!NzdAWN^Q zuV?&uuyq0ZgZzvKDpnzj`o-6~4~)!wi}EXkAZ|~d&ewnJzw~IL)#=vZ#%w&5>wfY0 z<`ktNq|xp|lh^i2+-}PGu_c4f`!^3smBkDr-k+1I??{b4P;21uPsL6RJyG&ZyGaBI z)MGR4n+F!@-ggv~6=EjI5w^N`_`44y*$T4IDF9(+t4?wiw-2x&`X-f%xD~+nTPV{V zDuAqPv)-LXlh2CffI5>>7EzSN#4GnrlU?3t5hRu-vwoma=9MDho@g%jNV&Dl-n}ty z9x=wl4%QK)UkUzMTXi>JTKmv-@}{o3Pz&a+w4P<=7T@ax8jO#|t5nCFlyE#(LxMcJ zTEDhNXuk`$ZqnE1xdXgWA6VFnEGOlzf%@M>vkM4#$i)=u-!a&QB#-=L`l*^=0AebS zgm2G?E`B)8l(aNLV1x?LBXmA3TFLjp{ETP%SrRhfd{Z>-grY5;BuQ{SCNz-IGO$s4dow{8x!FRlf>HI}X&jZdQpAW}3#576B#p=D#syLHM z@Cz?#LA1U`nW!ch9>Z{e7HpN{3^GYS?0MwUB0oIO@94FvXt@)yNBBvcEqz^lHA_#R zeP3r#pDkKTK+lFmQ^e#UDTPai=Qy0Tn$D%>o|j@2X-HuWIwdOi@W(SlwAzv5^M~J9 zE5~u^H799&?X@2)Nb;LkX4i0Pv^GPbwlvxVVoTCL)zvs#a1=qg1-Yf1RGFG9LC!uJ zL8W@>(Q~dEVS2_I3Ncz@bt|s)#Hoz9y^)XaTe{y}jjv{Hj;4-*NH1(ySy(ip zltSHXmMc59zPy}&#-VTH*XLb*=!)ctzOLIjvB$qOO(?}ZI*Ir-4YdhZAKi}>CZ>6JI8^-H>3V$i><#o{AX?wbjmEnO~Xst&SXy~n1i>(Fvd?a~D zV0HEIL|&^IZ<==Zd3}#eFH{7Ll@I=bfa^P9vxK^Ji1-Dw;^#J`Mf0(#!L9J>W>+SQ zK<%$;)E3cE+j*EuKWL*TN>$h~`=sreLU7Goyc4jAk?$MU5J~J3&VhA*<3R;LYOCBz z%U?OJnk)B{IY^9tV57JYw@yU7r_sDbJ@d-tltKU{ESU=}BB{**(voBt1QCn~Tx=T+ zxmSzjgvOrx6i0ZWYRWyj&PEV4J67WKmo8#X3=}lPM=pP{p}OD_lS5>=&k~1O5B5(P zhtl7mQ=roFIbW5FBa|HUmC!dK*d^S;;g#SiAy!D*DV$d0ob+G*7UcJqr%7v|BA)-Efhs%E^+ zyzBQwU*w~uvD?i>jOr5^*8*M$>Z_ig&s!hCip4kaV1bnh$1bphlOs<#mE*0d-=qu6c09kS|<`qv zJWTnH1sJcTYEqn;r~0~DO;9Wv&R5E!g0S6q1Xa^`6>rd6$XBY}!~gc|wJ#N!gn-*r zMwOh_R&6nneFq1Ww8x~05_VV}q`s4g{keqoz?_{k%9_c|aiQi~=P`vC4p^B!R+rmC zr+W`|DrlyOh0s5AqQB@t6XXp-3O{78SykyHWzP zggMYT=MZeb>&0n-XZpJHz`pkFdN1g2@+2S`vn4`$QLhC=;&8#T-&7$GE`;1y4`cvP zF}jSh*zbomNz<(yA>uEnHh?s8Pq^`t#5{ z4lxJyIYCvqMz=Di*fVgk@||vijje;*acC`fhX<08KO`na68%D;rqi@c6b~t%WHSlT zFNLc1wcgNIOOf6?*GiK zoz`s+k@TPs66#43QF-_n9#U9_(U*uMa5NtRqi-)z*WLmt!P~Rzck|QAn}deq^>A|q zx3zVAe_IK&GBN~6(|Wz{;z@c)%o=%tcqu7FSxqkF@<+qDsq&I1YT*;?D5KE`siCWI>{ zW}m>bjJkC;oM&~ln6pZvL5^(DXrJj8zFyBTHC20aT9}z7&qY(SSI@maAz$BqnXecJ z?z~fL^Cqu7Y-PeG;LRzR685`Z>qwRjAXjE`T{#Jg_od5%nuj-ecs zk>lK69#F`eG!pA56JSijG+E`GHD?2%akk{Z-%h^I*Ps;oHyGW|(G*;@aG_^P@0*gymXcqYK`;Xbv+>UvWxgGe`LyTUBYW z=U9RH?W25xTj?+n1q|ByF(e$rlstGaRTUw1M z;T79`=?LzNZ-{8NYF)h11=c3pj9`6ED7Wj*bCUjIZcVi{##YNW8&AkBBM8926^$F> zAFA4OWN26$OVVQYjKamTGoKFGf}&+VJXY0s+uC4J%&R&7%mG;4D|qvjW*Ke2Fbs^G zcE7uAuiTZyNyo}MEhMxwAAL_d@2xTpvNZs*5x*eC(woc@E+(d;7bQGzeo7460a^Mq z;0If?W-7`pB)YIWsmXN6|nLPog~ zeY0xU;^O$Z8CJho9ehpe*ulNJ5SRT(L7mftSvow`2I@~~amHo&GY@R`&x5zR5xU9m zZQSjstE-Xinn8sP@%;_4`Y)s-JfAO@rZ-7QGI^b+7BBY8KGiZn>Dvsc6tGA{zNehb ztR+-lbL5T~2M#8^5JAMg&bGnrs&<?w7>_cF#}N`;!?Q9QGVJ% zu>${I8_de5a=9peGZd+%Gp&U%=N=mxxVkYsLYt?rvZ?GF}tc}plHkMC3BJ*O0eZ3W#4#%t6VTuaYwN!vwrjWWweK~nov(8zDKE4I+qQWzBvFOwLUOY|!?Wx6w?Km({kQIg4CUE+ApMCYfv>bi9C`g^2*8sAQPR*UhW;kP+@UE@Z@fc@S9AqV%u2UjjNKt$bBZ!d-z!XAe}!T`j&eVRb- zp*FgG8}%S>>}?EJL(m+3R$SfnXYJa5ik_RnU$|vnW#D6MrV=?W_?L$ZHf;T*I_CyL z@KIpH4t3VDOP6H`WLR}wZgYslQG`Eini0{mwa8#>F-qtgC z07A!1_L`>l2Z3|7B@I>p=52BufL(`6d@W3yu3UgT?61>yMe?zV8qQIt%~Thp%NFQO zyAQUZkvdA2Z)s6qAs!c|bJQ3L+6&uRw_n^D^d!U~Jd@r7k27inK*JcgoTN1r*%AaX zT4-q>t9)Xx9G$Al%Lek?K68}l0YFe|)Q5xaz0SdHU#){y+r!POtsYV3&bo;li|q39 zl(&TXwF?@g^uwJua!eV&Jq~smQXF`YuDkyFx#I|nNCe9W`0xN3w@a1dzdHQuhR)d07UA9J+ zu7hJf%Taau7KRLiX(!BDu3zMoSJIIb>9IVF)QxqO1{F{ZqVm>SQ1$5`mtZ`@S_6>m z1PWkZwy1j6b(-UWYzCxw9{;OwDNqOVGXS<_vey@yZT9V(sPoqM)>?Vd+$K-EZj*e7 z>gvNcv%PuYj7Q9&4*av|uwSt$6^-l7rFZQl^ zP5U42&)&Qo$zt<-Piv?k5}qnJjq5{-lY6JqPI)z+BMV95kRQ*fGG*U;`E3_b-&-&( zqEKq7(q`D9Q95Qt8uw|QJ=|8N#&)SyEgy^*4px0z?lEA*zds0u9tB)^NjB+_0GWtPOeK=ai^_g zmyH7W(iW%Vmtc>1&&`OQ@e04kX}MHh{&^W@9j9PWSK-2{Cfijsrzoc#U=LUv*^^qw zN%oLfrZ13<1fMR)f32G5t-lWb@G7esuRh;Xn3`3KFJ{?1tA5Si)x@|u{NnNzH7h{9 z*NNwr*E%prqTbxXI*}{Ke6*eG2n*XAsl#|}Ga&?Hxx;wQlj7P3Luc)!QX4Ctd?!;P z*{qgC#INRZBhWG8+nTn&Ub&7S^cO0AIB!<$T2aM}fU23$GASR}IM?C0hih5R?5Bj= z`Nb>tmH+Qc8sT*87*o9?-6{L>u!jr=r}{0;UZ(F3VkY;`W#yA(mT`(*YCpTn6KV3& z4R}$<+8$wZ=G5PQ?$>U;uTvEJ3vNXI4Zw}!{u`J=nM(usC%B$m4p6OUPdu1mOm|-I z6KMpDP>^4mu5iLOr)ZI=nU8D6{Mw=tycfsEeqhLl55S#Pw@Gz$OV)fU5BV1Ti6wOM zhc22My6*;K_Q?o4T;F6POTQ7H!m34RCtm%w59E>1h&DX+)dfS1E8U3a!32}QfNd#& zP%1qLfltzr)PV-^oiEhY#N(q64R= zPG)Z?Bbta=9s7T;JCqZlr$~y|neY5qW8irN@4bi9waro90eehmHU^O7DG)!BUeN^x zh0DSc?Ds?0^hqy`FyI7|euE|OHlS3Gp#d1o0n%#jD3&L)i}9JJjjf4zh7n-oBXv`_V93y6Z_1oLr#6TCA z2j|onQasM7GLY2qt=b(b&dFMyMX!2hZKg8}YP7DT2)`UF*0-T3XK3KRJcc>VqboQW zP!d&WHh~Mf0%rprW!g|tnz4K|&Bzn+QOT*Vc?@H@V$x-yqYh#$4dSs|j-1|3X-GC7 zL@O_O5>t)`_U|B8fE_`ierTU=;F8{xm7zvXtfUZLP^J5dPc-HA_lQ+2{IH^Q+jFJ* zMfa+srcQc!&I$wZsSpGWjrF1 z#_!BPxyz+`3_4KidEH>_PBr?A1?8Sk-dc^lM$nQ^!fBa7EiV>?>T3ai=@pk-W_r?G zP0ElyS4GjwW;!GwcSH+~0?L}ba}iLyIGKMD?YX;MW9Cw0KaV}bjbatAUDFkjzgFqF zC#m44!T1OX#8fKzMvE|t9#L}4XTGDx#qRqksi%_vATs1Okxz33gnaK%@%^2&*D-d@ z!%uDatiK_X;cFx@&{mrM4DMm{pDD*w{MeC4B z0*Xxqww3*)6LOrNk)|VJM5WzFGX1sA0 zR5xPVD{bS)n8ATo-@(xlCmr`ywp(rPS&5JGb5_c9@F&z+cG{LI?FXneAsN9l z>@7H>JjQG|;Ukh!g`;&d-b1on!b7f7qCZvETov{p+QrwN2c?`F#xK^NN><~b_)1fA zue@hYL6b`hyMmxlm{PdzEGFS6fH)j?&OHNp-4#ShAV%i)XN8LK#9+9IvjGXoF(l6G z3xzZD;3jkv>n+Rd_?1NM3+Lz&p^pr#S{@CvcwM{vjtlZm^`=iQ?EUGG>~vM$Yle_t zo=wB9R;Ya7GUTsraPY9>g1nEdpIF|F=2<1JhQ#D#FmKdf4mSB+)5)%Ap%bbzrA?aA zwNlSX&sYKgL=sajXK|ZG(&%pX53-6X;t}0z57Hffa>?hnU*~dJEY7C@+ymsdy#B$t zf}9>*XUcwnCPjlj#d*cOFwR(a8Qf1R%^=l|h-S-adrNR5qMx!=7+$PB^*S}H7kcfx zG4{OK+oWi*QF|?pYep`eHtu1_df12GuwfCd;x%3%in?<)&}Xt&(lVBm#6vAmQR27V zL8fN4HTe1|9q%JAut{O~8Yeyy$io}L4;g?HX2Y}2gW39YiXkN)yvVgY;&*nnTTfQ! z?#(FKPgH`a>Wo>&`{L{pZn|UBw%GD_k;1EDwAkxC7OG2=H8dtTxQA`DO`mx0@tX}K zQ7+VTa@z=+4>iJVebT)YB|HjbPKgHcr1in;DTfXT2lx_6Xh14S&IjA zjO)sY>2fv0#6Zy^onpg}5c)54VPYhj=$ldT@f^Z0&y1;H-=ew(t$ml?X}#58;p>=s z8~JtQ9Z8lkMqKK2VUr!b*EQ9dlLE9pxJUK#_5i$+stIhiFgcjg1_IN6JRB8mAOcS9 zfbYj68O4s^#xY2=Utihw%-M1ufdc1vAMB%(&PS{e>hU#CJ3G7CbiohjXNS)COII#S z`>g`Smt3FN&9cid$HH`vm@~?lb?H!Tq&+!o7Ed@En|y;7N>q1fRbx@fa7)>wC^K6; z9ecVe81_UO4?vEXZBse1b`^uT=g>H7P&jX!BdCuY#er2V3W{qoH76~oa`2Jt=ez#WMr*HRqeG}Q5!*}n?7WLAgl^{+>nUXI@@FoOklN73uS%0L4ljR4=%=HAHXQsjNAVbYWth%f$%yK#bTHh!O6 zlVkwMZ6KZXC$Fg%#)(rt#(uyVC?R3W7>;Yg2*znlxqv_tmt7fbl!l(Xop597Ca{?s z&*)j022w??z+6`lCPKC#a?7gCk)`i^x>X@yQVw-=e}jK4{VM9DbZ<1F&_3V`!sLz^ zkEZpKS2)=EGNdn0e^elNBx|KgeG(U*%$^vv$LpifOYGoTOW>jt`j0;pF117=j?0oiTT3HU2mJE^+O4<-vCzvBa=m$8Lp5yW zl7g;6t}2FEK3}!Yljs#)VJzhFqzh)X3sC8LE7Sa|eISU}8)Eg&`Tg0Ah3vYF2kVoF zS`$;84!AeY&3^3r5ZsbQgPpItrNP*;?iN1(qmzxtUH!UG5ppK$8EH(Re6zV^e8ZZX zYg2^tWieGThh$hZMO&`(b+VD*u3bUDhyZi#Rd&sWljhGb3W*0VmA_c58s8|lN43s&P%lx#MscIM+tUKhs|UIly) zK!lxQ~@8l_~HacNN9-Tb3bTHpk9U(VYE59Fm@rVV#{Thv+J;)aRl`0g}#U)&Vl z2F7Of#Kz1~=dHxxvVTD8cZm8{fj%D^_wHt*IOG%4OaS`i;m(fLfRFmrosgQy(CqhC z$ic2Kt$;M&c(?uP&g+c+^7#P5w>T#1)G8-@7IN#midBH0=fifY?Wre!ttvY5? z@7zN($TX>VF-2*Fy5~x_B$l3g(X=f9i;X)Bv^q?Q_V9|l1seu3m4IWNcSM`d zm07VVAiUzbKp~${2?ADi&KeB18jTsP-9a{+qlYy>B;Dze8E8vy?mDb_hDWVN7~ntb{+9K1 zk9ur2@}B@Ki}p4O%`q&`3X7GAzsUK7|IL53eapdI0+Wf})FkA|FI;6;-kWZ71f7?!62>_4jmJL*kOIs|sil4n$|$ zUt+qs4Ahs8lgM-@|^J79Al)Y_Jo@uKFX^o+QXICoNJ#~Y+%SPZ!i;*mk-b)ww~q5lpo7}5}v`*I3aF- z402}L5DBa#RC{k^I{!Vs{?fo5u3n_>NihcpU+klg`r6|@%jbKiYJP()0Dz8O8$T(9 zoAZ$VzIEv&u^@1keW475ZP3>W2lEM9plpMQ=(Crk@JcPZbg|lL^6`P9I+1KL_nKxG zh=mq8TFmlTlWvb!Uk&~)9OceA-=YL?6^Rqf`|eB@kN7_ugAMjR39pNcqNQl_xY#xO zd5v7VpCXDx+!;1p$+oznfa|Zlx4L#sz`on^=RyquzSvn^lB$eas-({jgR9)Rq-5{< zFYMV?$?C-raco4}{UH`FtTK)r4&xUq7cyyGGt&>hGPG)j^@>k7n2~?970?d0t`=}v z8;f$rC%lo~Z_j6L;lGFJvhDMUKI>Z7~gCp`@5f45hWlU8qp^8LH~l*+>pjq_jA zpJhH;Yrn3D1EK*+{;Wvj1c#)5$t&mX+PUD2CpKuU+6mnGrzi9FHBIzx6YZBmyQ(|6 zqC6sNX<`=;NJhb|NZq{qZ&#wO6axwEYaSm;pj_dy2`oOj(R-1tz3XBh{3OfEG2EZ7 zLcKQf^O@@F2n zB|J`)M(TLdwC_cms>jJ&J^NFE;4U$~lYSuYDV=9fljcZ53{Oa|^R z1`ad;b&`)DR+vF?%E@(G34|rO?fT_3>}NRQrA4gQq&0wZig(=cA6dGjlQCd*TW(#iIN^C$+cf zYk_sPUAHOk&}&GI`yHSiG*sPY>+ZA_M^hu})NG}ttkb#t;J0r}Y-dJRulwx@pKoae z@x;9=bL}o;Jo2pNVkhf5;Fzj`>F;EFe$j`PInqh59O%|zQTO9$j>+x5Hjb;Y59uX~ z)<-dAV$Wg2foE+Vu4iilvmP~Hs*B10EK>h`HNf}rqSu%&m&Y==$MQk%ZI<-PF;C4> zV@oKrBa|L>T#M(Bn121?F=S%N5iMK}q*1``{%T}Y;^5T;jp4grV5(yAFO1bw1+Ygp zfh?VbvUI&`+I-C{gZ>20a!le`G9V3U)@lTBR?(|BA4FZ&neHW<)qvb#QIzX7GBCvlBFXUWsq|fZkG!Yvl9w7Jh$S_c-~l%fQ9U;fuo<|EFl@ zhDVp~=+g1`w<#A71DtWgzy46DHDu~7-KAxGzWjKzV!aw#v;x1n`m%@j<;}Cb{jd8< z++G4I+FyO20B-gBZj#5BZ6^rU^XkQP7snmd&+yTMT{80(zt@)+4bT6%>Hoy^8-}a~ zV)knfVPDthK3>>=y!n3WX~4xdmby_eQ?$;T#c@e(R>H|1^8egIk3G$H93&!m-_Oqi zsE4N79!U-DaO18&qg9dpimm$Q!nuJd1V05WwXk?Sj0 zbD@F`&?ZVR^IxuIhf9;rw>y$ohcLaeq`UktR=r;@Idn4gl}CDQ_PtjC*FWSB!<`LK z$mw^NIkUh1HcJMIU}fC@m)-=BsC}M1o{EjJ^1Wg9(b~2D$MLo9=+rx&JAg#tzmy$7 zuTl$12{D3ljKFXtE&#a4f3y1koZrOQggujJx-c^`_+<6#vT3^vsi)zjS_>BQ_bT(Q`l9Z~YD@SxuDhatZVRRQ1s7IukB z>Mhk++1lEQjg5_Bm1G$fPL^=m8S`Df_PdSS;J87e5tx|#Ig&8kcylAJ)OJ{2Y5l=R z5_M^+pQGgo1t`fTvj^y+5-wN!G*>u}tHz}L)1z1M33p%V`|a0rB|sA$xg19sTgOxX zC@_v43;J2q&(O$lhWuAwwlDI{im(DhdOhg++JBnODUML#;IHd=w@ITSv-*I>g-i>e zs6!nE8POzM|J#Xx0sS>X#kNj>P+XjVgE>1MS@~$7!0j_gRMarDPFjWR_pQ&=E|14t zng8@ItBSvSs(tuY{mD|7fWzpCmott-DITI8jo-%Dfm%4fe*HoyykSw3tdit_zOXO^ ztTs Date: Wed, 27 Sep 2023 16:11:05 -0700 Subject: [PATCH 0141/1931] fix alt-text --- docs/ide/lnt-int-naming-convention.md | 4 ++-- docs/ide/lnt-make-member-function-const.md | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/ide/lnt-int-naming-convention.md b/docs/ide/lnt-int-naming-convention.md index 40a01c8ffa..14a1a72608 100644 --- a/docs/ide/lnt-int-naming-convention.md +++ b/docs/ide/lnt-int-naming-convention.md @@ -57,13 +57,13 @@ void example() The editor can make the change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Apply naming convention**: -:::image type="content" source="media/int-naming-convention-apply-naming-convention.png" ::: +:::image type="content" source="media/int-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting to apply naming convention."::: The code editor shows bool myFlag = true. With the cursor on that line of code, **Show potential fixes** appeared and was chosen. Now **Apply naming convention** is visible and it shows bool my Flag = true in red and the suggested change, bool b My Flag, in green. You can now choose **Apply naming convention** to change the flagged code to bool b My Flag = true. :::image-end::: ## Remarks -The `int-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. This check check can be applied to any project that has an `editorconfig` file, and can customize your `.editorconfig` file to suit your project's coding style. +The `int-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. ## See also diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index b761eb8855..2c27d0a956 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -35,7 +35,7 @@ double getRadius() ## How to fix the issue -The solution proposed by the linter is to mark member functions `const` when they do not modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. In the following example, `const` has been added to `getValue()` and `getRadius()`: +The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. In the following example, `const` has been added to `getValue()` and `getRadius()`: ```cpp class MyClass @@ -59,15 +59,15 @@ double getRadius() const // added const The editor can make this change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Make member const**: -:::image type="content" source="media/make-member-function-const.png" ::: -The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to change make the change. +:::image type="content" source="media/make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: +The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to make the change. :::image-end::: ## Remarks -This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they do not modify the object's state. +This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they don't modify the object's state. -The current implementation of this check allows for the assignment of `const` to member functions after their declaration. However, it is a good practice to declare member functions as `const` from the beginning if they do not modify the object's state. +The current implementation of this check allows for the assignment of `const` to member functions after their declaration. It's a good practice to declare member functions as `const` from the beginning if they don't modify the object's state. ## See also From 43b0191192a83f6a65b17497f80da6b01e407446 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 27 Sep 2023 16:27:07 -0700 Subject: [PATCH 0142/1931] improve draft --- docs/ide/lnt-int-naming-convention.md | 30 +++++++--------------- docs/ide/lnt-make-member-function-const.md | 12 +++++---- docs/ide/toc.yml | 4 +-- 3 files changed, 18 insertions(+), 28 deletions(-) diff --git a/docs/ide/lnt-int-naming-convention.md b/docs/ide/lnt-int-naming-convention.md index 14a1a72608..cb33c44196 100644 --- a/docs/ide/lnt-int-naming-convention.md +++ b/docs/ide/lnt-int-naming-convention.md @@ -10,32 +10,20 @@ monikerRange: ">=msvc-170" Ensure that the naming convention for symbols aligns with the coding style specified in the project's `.editorconfig` file. -To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. For an example `.editorconfig` that specifies the naming conventions for Unreal Engine projects, see [`.editorconfig` on ](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). +To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. For an example `.editorconfig` that specifies the naming conventions for Unreal Engine projects, see this example on [GitHub](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). Once you have the `.editorconfig` file in your project, turn on the `int-naming-convention` check with the **Naming Convention** setting in the C/C++ Code Style options. For information about how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). ## Example -The For example, an `editorconfig` file that contains: +Given an `editorconfig` file that contains: -```cpp -class MyClass -{ - -public: - - int getValue() { return value; } // Flagged: ‘getValue’ doesn't modify the object's state. - - void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state. - -private: - - int value = 42; - -}; +``` +cpp_naming_style.boolean_style.capitalization = pascal_case +cpp_naming_style.boolean_style.required_prefix = b `````` -flags the following code: +The linter will flag the following code: ```cpp void example() @@ -46,7 +34,7 @@ void example() ## How to fix the issue -Change the naming based on the code style specified in the `.editorconfig`. For example: +Change the naming to match the style specified in the `.editorconfig`. For example: ```cpp void example() @@ -55,9 +43,9 @@ void example() } ``` -The editor can make the change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Apply naming convention**: +The editor can make the change for you. Place the cursor on the flagged symbol. Choose **Show potential fixes** and then **Apply naming convention**: -:::image type="content" source="media/int-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting to apply naming convention."::: +:::image type="complex" source="media/int-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting applying naming convention."::: The code editor shows bool myFlag = true. With the cursor on that line of code, **Show potential fixes** appeared and was chosen. Now **Apply naming convention** is visible and it shows bool my Flag = true in red and the suggested change, bool b My Flag, in green. You can now choose **Apply naming convention** to change the flagged code to bool b My Flag = true. :::image-end::: diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index 2c27d0a956..b4ee097a53 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -8,7 +8,7 @@ monikerRange: ">=msvc-170" --- # `make-member-function-const` -When member functions don’t modify their object state, mark them as const. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). +When member functions don’t modify their object state, annotate them with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). ## Example @@ -18,13 +18,11 @@ class MyClass public: int getValue() { return value; } // Flagged: ‘getValue’ doesn't modify the object's state. - void setValue(int newValue) { value = newValue; } // OK: ‘setValue’ modifies the object's state. private: int value = 42; - }; double getRadius() @@ -35,7 +33,9 @@ double getRadius() ## How to fix the issue -The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. In the following example, `const` has been added to `getValue()` and `getRadius()`: +The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. + +In the following example, `const` has been added to `getValue()` and `getRadius()`: ```cpp class MyClass @@ -57,12 +57,14 @@ double getRadius() const // added const } ``` -The editor can make this change for you. Place the cursor on the flagged symbol, and choose **Show potential fixes** and then **Make member const**: +The editor can make this change for you. Place the cursor on the flagged symbol and choose **Show potential fixes** and then **Make member const**: :::image type="content" source="media/make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to make the change. :::image-end::: +Make this change for all flagged member functions. + ## Remarks This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they don't modify the object's state. diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index a6602986d0..c264f88810 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -32,10 +32,10 @@ items: href: ../ide/lnt-logical-bitwise-mismatch.md - name: lnt-int-naming-convention href: ../ide/lnt-int-naming-convention.md - - name: lnt-uninitialized-local - href: ../ide/lnt-uninitialized-local.md - name: lnt-make-member-function-const href: ../ide/lnt-make-member-function-const.md + - name: lnt-uninitialized-local + href: ../ide/lnt-uninitialized-local.md - name: Change signature href: ../ide/refactoring/change-signature.md - name: Convert to raw string literal From 4d0a6a75344cbb4a7ccad05c9deb575f443024f2 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 27 Sep 2023 17:01:32 -0700 Subject: [PATCH 0143/1931] draft --- docs/ide/lnt-make-member-function-const.md | 8 +++---- ...convention.md => lnt-naming-convention.md} | 22 +++++++++---------- docs/ide/toc.yml | 4 ++-- 3 files changed, 17 insertions(+), 17 deletions(-) rename docs/ide/{lnt-int-naming-convention.md => lnt-naming-convention.md} (82%) diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index b4ee097a53..52747bc542 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -8,7 +8,7 @@ monikerRange: ">=msvc-170" --- # `make-member-function-const` -When member functions don’t modify their object state, annotate them with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). +When member functions don’t modify the object's state, annotate them with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). ## Example @@ -33,7 +33,7 @@ double getRadius() ## How to fix the issue -The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This provides a clear indication to both developers and the compiler that the function is safe to call on `const` objects. +The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This let's both developers and the compiler know that the function is safe to call on a `const` object. In the following example, `const` has been added to `getValue()` and `getRadius()`: @@ -59,7 +59,7 @@ double getRadius() const // added const The editor can make this change for you. Place the cursor on the flagged symbol and choose **Show potential fixes** and then **Make member const**: -:::image type="content" source="media/make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: +:::image type="complex" source="media/make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to make the change. :::image-end::: @@ -69,7 +69,7 @@ Make this change for all flagged member functions. This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they don't modify the object's state. -The current implementation of this check allows for the assignment of `const` to member functions after their declaration. It's a good practice to declare member functions as `const` from the beginning if they don't modify the object's state. +The current implementation of this check allows you to add `const` to member functions after their declaration. It's a good practice to declare member functions as `const` from the beginning if they don't modify the object's state. ## See also diff --git a/docs/ide/lnt-int-naming-convention.md b/docs/ide/lnt-naming-convention.md similarity index 82% rename from docs/ide/lnt-int-naming-convention.md rename to docs/ide/lnt-naming-convention.md index cb33c44196..52ae1fce73 100644 --- a/docs/ide/lnt-int-naming-convention.md +++ b/docs/ide/lnt-naming-convention.md @@ -1,18 +1,18 @@ --- -title: int-naming-convention -description: "Reference for Visual Studio C++ IntelliSense Linter check int-naming-convention." +title: lnt-naming-convention +description: "Reference for Visual Studio C++ IntelliSense Linter check lnt-naming-convention." ms.date: 09/27/2023 -f1_keywords: ["int-naming-convention"] -helpviewer_keywords: ["int-naming-convention"] +f1_keywords: ["lnt-naming-convention"] +helpviewer_keywords: ["lnt-naming-convention"] monikerRange: ">=msvc-170" --- -# `int-naming-convention` +# `lnt-naming-convention` Ensure that the naming convention for symbols aligns with the coding style specified in the project's `.editorconfig` file. To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. For an example `.editorconfig` that specifies the naming conventions for Unreal Engine projects, see this example on [GitHub](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). -Once you have the `.editorconfig` file in your project, turn on the `int-naming-convention` check with the **Naming Convention** setting in the C/C++ Code Style options. For information about how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). +Once you have the `.editorconfig` file in your project, turn on the `lnt-naming-convention` check with the **Naming Convention** setting in the C/C++ Code Style options. For information about how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). ## Example @@ -21,9 +21,9 @@ Given an `editorconfig` file that contains: ``` cpp_naming_style.boolean_style.capitalization = pascal_case cpp_naming_style.boolean_style.required_prefix = b -`````` +``` -The linter will flag the following code: +The linter will flag the following code because it isn't prefixed with 'b' and it isn't Pascal case, as specified in the `.editorconfig` file: ```cpp void example() @@ -34,7 +34,7 @@ void example() ## How to fix the issue -Change the naming to match the style specified in the `.editorconfig`. For example: +Change the naming to match the style specified in the `.editorconfig`: ```cpp void example() @@ -45,13 +45,13 @@ void example() The editor can make the change for you. Place the cursor on the flagged symbol. Choose **Show potential fixes** and then **Apply naming convention**: -:::image type="complex" source="media/int-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting applying naming convention."::: +:::image type="complex" source="media/lnt-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting applying naming convention."::: The code editor shows bool myFlag = true. With the cursor on that line of code, **Show potential fixes** appeared and was chosen. Now **Apply naming convention** is visible and it shows bool my Flag = true in red and the suggested change, bool b My Flag, in green. You can now choose **Apply naming convention** to change the flagged code to bool b My Flag = true. :::image-end::: ## Remarks -The `int-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. +The `lnt-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. ## See also diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index c264f88810..9aa4fb1645 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -30,10 +30,10 @@ items: href: ../ide/lnt-integer-float-division.md - name: lnt-logical-bitwise-mismatch href: ../ide/lnt-logical-bitwise-mismatch.md - - name: lnt-int-naming-convention - href: ../ide/lnt-int-naming-convention.md - name: lnt-make-member-function-const href: ../ide/lnt-make-member-function-const.md + - name: lnt-naming-convention + href: ../ide/lnt-naming-convention.md - name: lnt-uninitialized-local href: ../ide/lnt-uninitialized-local.md - name: Change signature From 7a0e011807ad74092ceab7f9adb3d3920564be82 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Thu, 28 Sep 2023 17:09:29 +0800 Subject: [PATCH 0144/1931] Add example for C2018 --- .../compiler-errors-1/compiler-error-c2018.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2018.md b/docs/error-messages/compiler-errors-1/compiler-error-c2018.md index 5b4dda0985..f81256fbfb 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2018.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2018.md @@ -11,3 +11,21 @@ ms.assetid: 86b54573-dca0-4446-be1a-e3ac489c073b unknown character 'hexnumber' The source file contains an unexpected ASCII character, which is identified by its hex number. To resolve the error, remove the character. + +The following sample generates C2018: + +```cpp +// C2018.cpp +int main() { + @ // C2018 +} +``` + +Possible resolution: + +```cpp +// C2018b.cpp +int main() { + +} +``` From 1a24d1c0645bc2472fb880d51950fff597bdc0ba Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Thu, 28 Sep 2023 17:35:12 +0800 Subject: [PATCH 0145/1931] Add example for C2023 --- .../compiler-errors-1/compiler-error-c2023.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2023.md b/docs/error-messages/compiler-errors-1/compiler-error-c2023.md index aa1bd0032b..ab9dba93d8 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2023.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2023.md @@ -12,3 +12,22 @@ helpviewer_keywords: ["C2023"] The compiler found an alignment specifier for a class type that's different from a previous declaration, or an **`enum`** alignment specifier that's different from the natural alignment of the base type. To resolve this error, make sure all declarations and definitions of the type use the same alignment value. + +The following sample generates C2023: + +```cpp +// C2023.cpp +class alignas(2) C; + +class alignas(4) C {}; // C2023 +``` + +Possible resolution: + +```cpp +// C2023b.cpp +// compile with: /c +class alignas(2) C; + +class alignas(2) C {}; +``` From ce3b0695553cbbf1aa7630f7d30776c984c0501f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 11:21:01 -0700 Subject: [PATCH 0146/1931] prepare for review --- docs/ide/lnt-make-member-function-const.md | 18 +++++++++--------- docs/ide/lnt-naming-convention.md | 6 +++--- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index 52747bc542..e1b9356df1 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -1,12 +1,12 @@ --- -title: make-member-function-const -description: "Reference for Visual Studio C++ IntelliSense Linter check make-member-function-const." -ms.date: 09/27/2023 -f1_keywords: ["make-member-function-const"] -helpviewer_keywords: ["make-member-function-const"] +title: lnt-make-member-function-const +description: "Reference for Visual Studio C++ IntelliSense Linter check lnt-make-member-function-const." +ms.date: 09/28/2023 +f1_keywords: ["lnt-make-member-function-const"] +helpviewer_keywords: ["lnt-make-member-function-const"] monikerRange: ">=msvc-170" --- -# `make-member-function-const` +# `lnt-make-member-function-const` When member functions don’t modify the object's state, annotate them with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). @@ -33,7 +33,7 @@ double getRadius() ## How to fix the issue -The solution proposed by the linter is to mark member functions `const` when they don't modify the object's state. This let's both developers and the compiler know that the function is safe to call on a `const` object. +Mark member functions `const` when they don't modify the object's state. This lets both developers and the compiler know that the function is safe to call on a `const` object. In the following example, `const` has been added to `getValue()` and `getRadius()`: @@ -59,7 +59,7 @@ double getRadius() const // added const The editor can make this change for you. Place the cursor on the flagged symbol and choose **Show potential fixes** and then **Make member const**: -:::image type="complex" source="media/make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: +:::image type="complex" source="media/lnt-make-member-function-const.png" alt-text="Screenshot of the editor suggesting to make member const." ::: The cursor is on the line int getValue() and **Show potential fixes** appeared and was chosen. Now **Make member const** is visible and it shows the get value function with const added to it. You can now choose **Make member const** to make the change. :::image-end::: @@ -67,7 +67,7 @@ Make this change for all flagged member functions. ## Remarks -This check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they don't modify the object's state. +Introduced in Visual Studio 2022 17.8, this check focuses on `const` usage for member functions in C++ code. The C++ Core Guidelines recommends marking member functions as `const` when they don't modify the object's state. The current implementation of this check allows you to add `const` to member functions after their declaration. It's a good practice to declare member functions as `const` from the beginning if they don't modify the object's state. diff --git a/docs/ide/lnt-naming-convention.md b/docs/ide/lnt-naming-convention.md index 52ae1fce73..58d241b49f 100644 --- a/docs/ide/lnt-naming-convention.md +++ b/docs/ide/lnt-naming-convention.md @@ -1,7 +1,7 @@ --- title: lnt-naming-convention description: "Reference for Visual Studio C++ IntelliSense Linter check lnt-naming-convention." -ms.date: 09/27/2023 +ms.date: 09/28/2023 f1_keywords: ["lnt-naming-convention"] helpviewer_keywords: ["lnt-naming-convention"] monikerRange: ">=msvc-170" @@ -23,7 +23,7 @@ cpp_naming_style.boolean_style.capitalization = pascal_case cpp_naming_style.boolean_style.required_prefix = b ``` -The linter will flag the following code because it isn't prefixed with 'b' and it isn't Pascal case, as specified in the `.editorconfig` file: +The linter will flag the following code because it isn't prefixed with 'b' and because it isn't Pascal case, as specified in the `.editorconfig` file: ```cpp void example() @@ -51,7 +51,7 @@ The code editor shows bool myFlag = true. With the cursor on that line of code, ## Remarks -The `lnt-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. +Introduced in Visual Studio 2022 17.7, the `lnt-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. ## See also From 49ffa0fbd0213a247b946a88f8f0c76657a6fdd9 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 11:27:16 -0700 Subject: [PATCH 0147/1931] rename graphic --- ...t-naming-convention-apply-naming-convention.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/ide/media/{int-naming-convention-apply-naming-convention.png => lnt-naming-convention-apply-naming-convention.png} (100%) diff --git a/docs/ide/media/int-naming-convention-apply-naming-convention.png b/docs/ide/media/lnt-naming-convention-apply-naming-convention.png similarity index 100% rename from docs/ide/media/int-naming-convention-apply-naming-convention.png rename to docs/ide/media/lnt-naming-convention-apply-naming-convention.png From aaee92f7ba09e9a4d65623933264a1a1b2df119f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 11:33:56 -0700 Subject: [PATCH 0148/1931] fix links --- docs/ide/lnt-naming-convention.md | 4 ++-- ...nvention.png => lnt-apply-naming-convention.png} | Bin ...const.png => lnt-make-member-function-const.png} | Bin 3 files changed, 2 insertions(+), 2 deletions(-) rename docs/ide/media/{lnt-naming-convention-apply-naming-convention.png => lnt-apply-naming-convention.png} (100%) rename docs/ide/media/{make-member-function-const.png => lnt-make-member-function-const.png} (100%) diff --git a/docs/ide/lnt-naming-convention.md b/docs/ide/lnt-naming-convention.md index 58d241b49f..5d9c5a6922 100644 --- a/docs/ide/lnt-naming-convention.md +++ b/docs/ide/lnt-naming-convention.md @@ -23,7 +23,7 @@ cpp_naming_style.boolean_style.capitalization = pascal_case cpp_naming_style.boolean_style.required_prefix = b ``` -The linter will flag the following code because it isn't prefixed with 'b' and because it isn't Pascal case, as specified in the `.editorconfig` file: +The linter flags the following code because it isn't prefixed with 'b' and because it isn't Pascal case, as specified in the `.editorconfig` file: ```cpp void example() @@ -45,7 +45,7 @@ void example() The editor can make the change for you. Place the cursor on the flagged symbol. Choose **Show potential fixes** and then **Apply naming convention**: -:::image type="complex" source="media/lnt-naming-convention-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting applying naming convention."::: +:::image type="complex" source="media/lnt-apply-naming-convention.png" alt-text="Screenshot of the IDE suggesting applying naming convention."::: The code editor shows bool myFlag = true. With the cursor on that line of code, **Show potential fixes** appeared and was chosen. Now **Apply naming convention** is visible and it shows bool my Flag = true in red and the suggested change, bool b My Flag, in green. You can now choose **Apply naming convention** to change the flagged code to bool b My Flag = true. :::image-end::: diff --git a/docs/ide/media/lnt-naming-convention-apply-naming-convention.png b/docs/ide/media/lnt-apply-naming-convention.png similarity index 100% rename from docs/ide/media/lnt-naming-convention-apply-naming-convention.png rename to docs/ide/media/lnt-apply-naming-convention.png diff --git a/docs/ide/media/make-member-function-const.png b/docs/ide/media/lnt-make-member-function-const.png similarity index 100% rename from docs/ide/media/make-member-function-const.png rename to docs/ide/media/lnt-make-member-function-const.png From c0b8d72cd022ca1addb9b706de5a55e665c2577c Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 11:50:59 -0700 Subject: [PATCH 0149/1931] cleanup --- docs/ide/lnt-make-member-function-const.md | 6 ++++-- docs/ide/lnt-naming-convention.md | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index e1b9356df1..c799ebdd72 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -8,10 +8,12 @@ monikerRange: ">=msvc-170" --- # `lnt-make-member-function-const` -When member functions don’t modify the object's state, annotate them with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). +When a member function doesn’t modify the object's state, annotate it with the `const` keyword. This guidance comes from the [C++ Core Guideline Con.2](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#con2-by-default-make-member-functions-const). ## Example +The following code is flagged twice by the linter because `getValue()` and `getRadius()` don't modify the object's state: + ```cpp class MyClass { @@ -33,7 +35,7 @@ double getRadius() ## How to fix the issue -Mark member functions `const` when they don't modify the object's state. This lets both developers and the compiler know that the function is safe to call on a `const` object. +Mark member functions `const` when they don't modify the object's state. This lets readers of the code and the compiler know that the function is safe to call on a `const` object. In the following example, `const` has been added to `getValue()` and `getRadius()`: diff --git a/docs/ide/lnt-naming-convention.md b/docs/ide/lnt-naming-convention.md index 5d9c5a6922..d0a503be4b 100644 --- a/docs/ide/lnt-naming-convention.md +++ b/docs/ide/lnt-naming-convention.md @@ -8,15 +8,15 @@ monikerRange: ">=msvc-170" --- # `lnt-naming-convention` -Ensure that the naming convention for symbols aligns with the coding style specified in the project's `.editorconfig` file. +Ensure that the naming convention for symbols aligns with your coding style, as specified in the project's `.editorconfig` file. -To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. For an example `.editorconfig` that specifies the naming conventions for Unreal Engine projects, see this example on [GitHub](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). +To enable this feature, add an `.editorconfig` file in the same directory as your project file. The `.editorconfig` specifies the naming conventions for symbols in your project. As an example, the naming conventions for Unreal Engine projects are specified in an `.editorconfig` on [GitHub](https://raw.githubusercontent.com/microsoft/vc-ue-extensions/main/Source/.editorconfig). Once you have the `.editorconfig` file in your project, turn on the `lnt-naming-convention` check with the **Naming Convention** setting in the C/C++ Code Style options. For information about how to change this setting, see [Configure the linter](cpp-linter-overview.md#configure-the-linter). ## Example -Given an `editorconfig` file that contains: +Suppose that you have an `.editorconfig` file that contains: ``` cpp_naming_style.boolean_style.capitalization = pascal_case @@ -51,7 +51,7 @@ The code editor shows bool myFlag = true. With the cursor on that line of code, ## Remarks -Introduced in Visual Studio 2022 17.7, the `lnt-naming-convention` linter check ensures that naming conventions align with naming conventions specified in the `editorconfig` file. You can apply this check to any project that has an `editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. +Introduced in Visual Studio 2022 17.7, the `lnt-naming-convention` linter check ensures that naming conventions align with those specified in the `.editorconfig` file. You can apply this check to any project that has an `.editorconfig` file. You can also customize your `.editorconfig` file to suit your project's coding style. ## See also From 8d0fa45220df94bf6bc9640c70be2e11fa446a34 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 11:54:20 -0700 Subject: [PATCH 0150/1931] acrolinx --- docs/ide/lnt-make-member-function-const.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ide/lnt-make-member-function-const.md b/docs/ide/lnt-make-member-function-const.md index c799ebdd72..9e419bf919 100644 --- a/docs/ide/lnt-make-member-function-const.md +++ b/docs/ide/lnt-make-member-function-const.md @@ -12,7 +12,7 @@ When a member function doesn’t modify the object's state, annotate it with the ## Example -The following code is flagged twice by the linter because `getValue()` and `getRadius()` don't modify the object's state: +The linter flags the following code twice because `getValue()` and `getRadius()` don't modify the object's state: ```cpp class MyClass From 7e5e61c472743387ac5cc68eed92454d09f1ba9d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 15:30:06 -0700 Subject: [PATCH 0151/1931] updates --- docs/code-quality/build-reliable-secure-programs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index f5ac490c09..df3b8f8180 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -1,7 +1,7 @@ --- description: "Learn more about: Building reliable and secure C++ programs by applying NISTIR 8397 guidelines." title: Build reliable and secure C++ programs -ms.date: 09/20/2023 +ms.date: 09/28/2023 ms.topic: "conceptual" --- @@ -182,11 +182,11 @@ Remove the now-invalidated secrets from your source code, and replace them with **Azure DevOps (AzDO)** -AzDO users can scan their code through Microsoft Defender for DevOps for known types of secrets. Defender for DevOps, a service available in Defender for Cloud, empowers security teams to manage DevOps security across multi-pipeline environments. Defender for DevOps is current in preview, available for free trial. Defender for DevOps provides the scanning service through GitHub Advanced Security for Azure DevOps (GHAS for AzDO). For more information on how to detect hardcoded secrets in code in Azure DevOps, see "Detect exposed secrets in code" in the following list of links: +AzDO users can scan their code through GitHub Advanced Security for Azure DevOps (GHAzDO). GHAzDO also allows users to prevent secret exposures by enabling Push Protection on their repositories, catching potential exposures before they are ever leaked. For more information on how to detect hardcoded secrets in code in Azure DevOps, see *Secret Scanning for Github Advanced Security for Azure DevOps* in each of the following links: +- [GitHub advanced security for Azure DevOps](https://azure.microsoft.com/products/devops/github-advanced-security) +- [Secret Scanning for GitHub Advanced Security for Azure DevOps](devops/repos/security/github-advanced-security-secret-scanning) - [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) -- [GitHub advanced security for Azure DevOps (GHAS for AzDO) | GitHub](https://partner.github.com/2022/10/12/azure-devops-article.html) -- [Detect exposed secrets in code](/azure/defender-for-cloud/detect-exposed-secrets) **In GitHub** @@ -201,7 +201,7 @@ GitHub provides known patterns of secrets for partners and users that can be con - [About secret scanning in GitHub](https://docs.github.com/en/enterprise-cloud@latest/code-security/secret-scanning/about-secret-scanning) > [!NOTE] -> During the Microsoft Defender for DevOps preview period, GitHub Advanced Security for Azure DevOps (GHAS for AzDO) is also providing a free trial of secret scanning. GitHub Advanced Security for Azure DevOps brings the same secret scanning, dependency scanning and CodeQL code scanning solutions already available for GitHub users and natively integrates them into Azure DevOps to protect your Azure Repos and Pipelines. +> GitHub Advanced Security for Azure DevOps brings the same secret scanning, dependency scanning and CodeQL code scanning solutions already available for GitHub users and natively integrates them into Azure DevOps to protect your Azure Repos and Pipelines. **Additional resources** From e9086eb78f85a02d399c730da7bd9dbd58c79a6b Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 15:37:48 -0700 Subject: [PATCH 0152/1931] acrolinx --- docs/code-quality/build-reliable-secure-programs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index df3b8f8180..65929c5f9c 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -182,7 +182,7 @@ Remove the now-invalidated secrets from your source code, and replace them with **Azure DevOps (AzDO)** -AzDO users can scan their code through GitHub Advanced Security for Azure DevOps (GHAzDO). GHAzDO also allows users to prevent secret exposures by enabling Push Protection on their repositories, catching potential exposures before they are ever leaked. For more information on how to detect hardcoded secrets in code in Azure DevOps, see *Secret Scanning for Github Advanced Security for Azure DevOps* in each of the following links: +AzDO users can scan their code through GitHub Advanced Security for Azure DevOps (GHAzDO). GHAzDO also allows users to prevent secret exposures by enabling Push Protection on their repositories, catching potential exposures before they're ever leaked. For more information on how to detect hardcoded secrets in code in Azure DevOps, see *Secret Scanning for Github Advanced Security for Azure DevOps* in each of the following links: - [GitHub advanced security for Azure DevOps](https://azure.microsoft.com/products/devops/github-advanced-security) - [Secret Scanning for GitHub Advanced Security for Azure DevOps](devops/repos/security/github-advanced-security-secret-scanning) @@ -383,7 +383,7 @@ When fuzzing reports a failure, it always naturally provides a reproducible test When using both sanitizers such as [Address Sanitizer (ASan)](../sanitizers/asan.md) and fuzzing: - First run your normal tests with sanitizers enabled to see if there are issues, then once the code is sanitizer-clean start fuzzing. -- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan. When compiled for ASan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html) which requires ASan to be enabled first. +- For C or C++, there are compilers that automate injection of runtime assertions and meta-data that enable ASan. When compiled for ASan, the resulting binaries link with a runtime library that can precisely diagnose [15+ categories of memory safety errors](../sanitizers/asan.md#error-types) with zero false positives. For C or C++ when you have source, use [LibFuzzer](https://www.llvm.org/docs/LibFuzzer.html), which requires ASan to be enabled first. - For libraries written in Java, C#, Python, Rust, and so on, use the [AFL++ framework](https://aflplus.plus/). **Key qualities** From 3634408501de484e0cea8e9f22f25e6c951a1dfd Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 15:39:53 -0700 Subject: [PATCH 0153/1931] fix link --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 65929c5f9c..6f4d85e2b3 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -185,7 +185,7 @@ Remove the now-invalidated secrets from your source code, and replace them with AzDO users can scan their code through GitHub Advanced Security for Azure DevOps (GHAzDO). GHAzDO also allows users to prevent secret exposures by enabling Push Protection on their repositories, catching potential exposures before they're ever leaked. For more information on how to detect hardcoded secrets in code in Azure DevOps, see *Secret Scanning for Github Advanced Security for Azure DevOps* in each of the following links: - [GitHub advanced security for Azure DevOps](https://azure.microsoft.com/products/devops/github-advanced-security) -- [Secret Scanning for GitHub Advanced Security for Azure DevOps](devops/repos/security/github-advanced-security-secret-scanning) +- [Secret Scanning for GitHub Advanced Security for Azure DevOps](azure/devops/repos/security/github-advanced-security-secret-scanning) - [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) **In GitHub** From 43398d9d74da4bb3a983dbd378c99935a6ba8387 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Thu, 28 Sep 2023 15:43:46 -0700 Subject: [PATCH 0154/1931] fix link --- docs/code-quality/build-reliable-secure-programs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/code-quality/build-reliable-secure-programs.md b/docs/code-quality/build-reliable-secure-programs.md index 6f4d85e2b3..d78bba452c 100644 --- a/docs/code-quality/build-reliable-secure-programs.md +++ b/docs/code-quality/build-reliable-secure-programs.md @@ -185,7 +185,7 @@ Remove the now-invalidated secrets from your source code, and replace them with AzDO users can scan their code through GitHub Advanced Security for Azure DevOps (GHAzDO). GHAzDO also allows users to prevent secret exposures by enabling Push Protection on their repositories, catching potential exposures before they're ever leaked. For more information on how to detect hardcoded secrets in code in Azure DevOps, see *Secret Scanning for Github Advanced Security for Azure DevOps* in each of the following links: - [GitHub advanced security for Azure DevOps](https://azure.microsoft.com/products/devops/github-advanced-security) -- [Secret Scanning for GitHub Advanced Security for Azure DevOps](azure/devops/repos/security/github-advanced-security-secret-scanning) +- [Secret Scanning for GitHub Advanced Security for Azure DevOps](/azure/devops/repos/security/github-advanced-security-secret-scanning) - [Microsoft Defender for DevOps Preview](https://www.microsoft.com/security/business/cloud-security/microsoft-defender-devops) **In GitHub** From febab84c2161c317dfbb33d2191a56409b406ebc Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 01:25:59 +0800 Subject: [PATCH 0155/1931] Add deprecation info to `auto_ptr` --- docs/standard-library/auto-ptr-class.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/standard-library/auto-ptr-class.md b/docs/standard-library/auto-ptr-class.md index 31235b6c2d..53ab473020 100644 --- a/docs/standard-library/auto-ptr-class.md +++ b/docs/standard-library/auto-ptr-class.md @@ -11,7 +11,7 @@ ms.custom: devdivchpfy22 Wraps a smart pointer around a resource that ensures the resource is destroyed automatically when control leaves a block. -The more capable `unique_ptr` class supersedes `auto_ptr`. For more information, see [unique_ptr Class](../standard-library/unique-ptr-class.md). +The more capable `unique_ptr` class supersedes `auto_ptr`. For more information, see [unique_ptr Class](../standard-library/unique-ptr-class.md). The `auto_ptr` class is deprecated in C++11 and removed in C++17. For more information about `throw()` and exception handling, see [Exception Specifications (throw)](../cpp/exception-specifications-throw-cpp.md). From 243fe3bdf40947a8607e9effe299464526cf1222 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 01:46:22 +0800 Subject: [PATCH 0156/1931] Add example for C2024 --- .../compiler-errors-1/compiler-error-c2024.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2024.md b/docs/error-messages/compiler-errors-1/compiler-error-c2024.md index d5535e724e..fe0b5e057f 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2024.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2024.md @@ -12,3 +12,22 @@ helpviewer_keywords: ["C2024"] The compiler found an **`alignas`** specifier applied to a function or other type that can't be aligned. To resolve this error, remove the **`alignas`** specifier. + +The following sample generates C2024: + +```cpp +// C2024.cpp +namespace alignas(2) ns { // C2024 + void func(alignas(8) int x) {} // C2024 +} +``` + +Possible resolution: + +```cpp +// C2024b.cpp +// compile with: /c +namespace ns { + void func(int x) {} +} +``` From 8a49244113ff27d4f99e8e385366f1c0f17afdcc Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 02:17:40 +0800 Subject: [PATCH 0157/1931] Augment C2082 --- .../compiler-errors-1/compiler-error-c2082.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2082.md b/docs/error-messages/compiler-errors-1/compiler-error-c2082.md index 25b3e93eed..e5a420137b 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2082.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2082.md @@ -16,8 +16,11 @@ The following sample generates C2082: ```cpp // C2082.cpp -void func(int i) { - int i; // C2082 - int ii; // OK +void func(int num1) { + int num1; // C2082 + int num2; // OK + + auto lambda1 = [](int num1){ int num1; }; // C2082 + auto lambda2 = [](int num1){ int num2; }; // OK } ``` From a90d9a1fb2f6ef59a38e465f14cf8bd8f92fcd38 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 29 Sep 2023 15:00:16 -0700 Subject: [PATCH 0158/1931] draft --- docs/ide/include-cleanup-overview.md | 32 ++++++++++++------ .../media/include-cleanup-dimmed-include.png | Bin 0 -> 13695 bytes docs/ide/media/include-cleanup-error-list.png | Bin 0 -> 5713 bytes .../include-cleanup-refactor-lightbulb.png | Bin 17208 -> 9522 bytes 4 files changed, 22 insertions(+), 10 deletions(-) create mode 100644 docs/ide/media/include-cleanup-dimmed-include.png create mode 100644 docs/ide/media/include-cleanup-error-list.png diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 679b82ac38..412b361c74 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -9,31 +9,43 @@ ms.custom: intro-overview Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: - Identifies and offers to remove unused header files--improving your build time. -- Identifies and offers to add headers for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. +- Identifies and offers to add header files for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. This article provides an overview of the `#include` cleanup tool. -## Configure #include cleanup +## Turn on #include cleanup -Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **Code Cleanup** > **Code Cleanup** and select **Configure Code Cleanup**. +Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers and add missing headers: -:::image type="content" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup. The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes tags and Add missing includes tags are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same contents but also adds dimmed."::: +:::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: +The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same options but also adds dimmed.:::image-end::: -**Refactoring only:**\ -The cleanup tool only offers to remove unused headers when you invoke refactoring by hovering the cursor over an `#include` to bring up the light bulb. You can also press Ctrl+period while the cursor is in the `#include` to bring up the refactoring light bulb: +The options are: -:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file."::: +**Refactoring only**\ +The cleanup tool offers actions it can take when you hover the mouse pointer over an `#include`. Or, place the cursor on the `#include` line and press Ctrl+period to bring up the quick action menu: -**Suggestion, Warning, Error:**\ -The `#include` cleanup tool offers to remove unused headers via a suggestion squiggle, or a warning or error in the Error List window. +:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: +When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." +:::image-end::: + +**Suggestion, Warning, Error**\ +The cleanup tool offers suggestions via a suggestion, warning, or error in the Error List window. In this screenshot, the `#include` cleanup tool is configured to indicate unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: + +:::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window.":::The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file.":::image-end::: **Dimmed:**\ -The `#include` cleanup tool offers to remove unused header by dimming `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header. +The `#include` cleanup tool indicates unused headers by dimming the line of the unused `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu to remove the unused header. + + +include-cleanup-dimmed-include.png For the exercises in this article, Remove unused includes tags is set to **Dimmed** and add missing includes tags is set to **Refactoring only**. +There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating required header files so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup???). + ## Direct vs indirect headers First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. Here's an example: diff --git a/docs/ide/media/include-cleanup-dimmed-include.png b/docs/ide/media/include-cleanup-dimmed-include.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f9f6381a53ef8b39a9270e6ee263ed8ab8a934 GIT binary patch literal 13695 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 literal 0 HcmV?d00001 diff --git a/docs/ide/media/include-cleanup-error-list.png b/docs/ide/media/include-cleanup-error-list.png new file mode 100644 index 0000000000000000000000000000000000000000..0d6eeba3ad6d15472b08f377522233c07c35df25 GIT binary patch literal 5713 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 literal 0 HcmV?d00001 diff --git a/docs/ide/media/include-cleanup-refactor-lightbulb.png b/docs/ide/media/include-cleanup-refactor-lightbulb.png index bb4909929105c396f97ac57d23da543e6a08ca26..46054e98943addc38b895f6de3f7297b20a3a22e 100644 GIT binary patch literal 9522 zcmZvC1z40p*Y?t=G$OIIQqr|ZgLKQ%EwF&V(%mT?OG+bBBE6I}NP~ia2upW^bjQEw z`+xuUUf2Iz*X};&nVILDnKLu@IrnVj8&x^n#}tnN006Fnyfhd9KqW%nM`5EPza3Bc z{vdx)T)=X#0TsiPTSx)jN>W7<0H}_Ca$|~tlpi_D>$v~`cwG-4ls<>g5CGsspMtcc zrl;{<_7lyC$?QLkdh^QKW7cEJdt55EX3DKwo4+#Gr!BP^w^XJXOU#}1wtiKp?!71- zR{qpz_k+SA6EzV{41kg=FP%^3MeY^3_~h~9-bFNZ33ZX+2+Cn~37L>ja$UE3eF699 z_inE`1RY=9i0w2OUbo+0x0{6DUgxx)AGS+CSm$g<>Xf-(j{<@)VI`|BUjK3Q+r0L@Q_8L2lIR!339A(4K5ofn5& z-Nx6m!z(X@R5`CN&)zc_d0f`XdC%0}wk?*&vWwnKGrjuVo_eSMCB%ddJD31f4-}C! z{5e=cD~!GFR}VdT-Q^?hL%s0k%e6qqg|EA=LTXRTD6A1*$NdV+%a0wwZH-Vv5s;Ph z?{=t7Yfq)9^IY5R+IOpaS9pjCaRgiX`Yt;&5IdM`v_EV{-5{gJKAoLj#J9`e#MhxN zF;>}D7xnS0t?nBQKR@>7#B|?_L`jxFHONZQvA6MdO3jVU=I|U*z<})d#EvLKG+0!BuM?{>3^&Gs6TBFH7e!br?2Bw}y$81X8z zJ=~36@M<|tZx9k42)jL=oLZjnoUrvsPF2p-zQ`m;#H(;bsmz|X{)`ETDR7C7yTTav zT(*9)eF>Es49Wyck04g+b2pUzV|uJc*pJ>gy#y-Z^^El6QRQ;;Lj%07MTwBEI4w3{ zQnAZy{#4rQ7B5SO&Ew8xQ1E3qirNW58~7SJyD&HD@rqT}?VzFJ)g@7qD#+|v@hXk2 z6DYN~XJ+$-Or%MI+sDx@s7Nil*J0F+excs{psa_5ehj-y&s z>a*;Ot`*lg>t9j)eyKLMw`cPQYAc+1Vy*yshX=XbSsRpsk))Mw;5Cl6ZN0OTZ;8H#MBfQB|Hbw088Ij708FM? zQKPVr&iJWAaK6jg3h6>btM`1F8vBRDO}^K{Gt4Y|0G+$7;4#~<;)rM+ix9Ka8dz+c z{mbXnbY5b|#Tu?+&gHJ1#Z5P+sBYEEV`VJm@$C~Ox1I#(kIZDjApbm>ZkJt|($6DI z9EMuhn33ZHVUEjRpr7fUXUH)-$58xU&67=nJu3|coM+cu3yXQKENiHl_}<<9~g2k(iIQRL!tHk$$JFbBrw$N2m4$ZpuAVH8>r`S((*Z zzlGL!&QvEx^_y;8qKgffB`iuBPm?Xoe%qKPyVJw}1o64~W;>}oDc2>`q0O@WilH@{ zwttGwk+ftMtAQ&3H_qS`>CuoqJ17TJCu;+nMSi8Vj&lsVztmEmY$Cky4(GfRaCi-M z_=cEz%T%Een|J-ZUJK(?U>53N?$wKOJ1;wV7YqI^@}$zyWD8;9xF^!S-3-&>GhIFl z^^2=dP0i>95_I{e4V{6ERYjhd>NLzKg7)Wk?U|aNLLAJuXSc)ZhtDdE&*m2NYB#nX zVQ@F=>rV?AP*ADDIS*yJg2qqTAq`!|ZtsR`V{*$xDsNtF=hPJJ#^&m1ei<~U1FB3O zvHDaj-=IqNGE*QnTeoenUN%g9o7@w`&#TDEyH&MhhD#O%dI!Kz+-yVM1wTvdRRpb? zfKj5yOEtM&XFSUD1js%dZKSLC_=#(8&wYL!pZ=khhT9KzI->b}$Yg85bQX0zN{K5-l3Q;%_|w z5)*=#(-_~|rVP2av{kiH-J?+j)8+?Cq~admAILq5GS7I*u`xX0zisk`0@E)T!%M|m z^2?=xG!jvKqmdIc?u&@KqK2pDZd0($nn!hBTa*A#BFZ3%yhlx9K-{2XwjnUf{3t!atv2X@v|_^`#!#e29GKozjq6Qo~3lQ zBTtfedy~2n20i$k@$KBdB_^W@6w!#>)x{4dORtL(W*l}$TQHo!3Y&*DoE+?Z==nrX zBJCV{vsYQoZ_0{en2OeK`@DUaqF>k~AMZ3A(fF`gb!Hspil%a3>bNR~_VLm6r^z7^rSFfocJ^o%nwi#j*|1Bo$Zt67P?M?&XgsT( zn}@yPWj$fSQYBd85;cuncl>(Pw{lF3pFsMwzRoBQ%UVKYzOlg`BwP{O_4=Q zTS@Dm3f7%TJz^{E-5QVSbDi&5pR@M+M!an*Ilg3x^6v=Da3smU1U_M8Z<9e%c0`pJO7|&8A6hQX5 z@`J#8vo$B7zD-f}%lw~vnZuGluRVHK4?TMWKY4_PLUTB!aW3Z|z z(clu>HCK2$9A>3-lrUe|59U2cV?-wp(e3Y@2+7QUKAF-K_7#=;1%m8(A0IhH%16Q1 zV?Iis{%I-`o8C~^U3T4zLfv6{S>joj)IYi0f-XnAg5$*-BD{k6CWsF63<3y_IU{g? zU6h4Jw&JBd#q?tmE>8sQynguZhmuL{=a6_#!7Ftq<)q0PT#S`RO7laQ-$9J4y;|dC zT5qY7PS=Y-S58S|*9o{HMUNzV`MeR19-12!5mEZpw~%;z%5RGnXf{MQeSC9UP6>0^ zO$~?6YjoJn-W?tWyLP&{RjVT0=Ud-(%xnhcQtNAmXZWlV*+sub?ghWuH|FqU5_YvY z+y;BQYxrrbXhkrU>8+e(Iv}6!l6IRoIQ~efVfa}}`=zorb7SV|Obedf z@Tx9T4ngROzHQ#CW)?oCL~LHYg2$PIQ8T%j3L}2O8M*_Q!L;TSu~4!&YsG$tpB!EI zu)KccGi;*3v^~2Eyoc2cqec7ADt?HVX!`*N&Cpe*FzjPmAS(5Hn%5Eu)o6UZ(I+(F7!ICXCzp46A0)qAXMw~?Uh4=%yqZ6)Ai0P+LqXv%bKL=!czd6+9%wy53SKYiv6AXAK9`IBXaveoVxBhJl9`k--eX9lYVT`+J z$RPP30ee$vPtDn)Wqr9y8hnkP1HFBJ?zO^K_#(P{@4fpc^zl)2Y^g%&0EfW&fWYEo zihqOiR%pg?;aw?<@*Njr`O%RhJJ`bSRrQ+YqX=o^Z}?x_rCo)9rH{Lgi36~?k%I$4 zGHhZ{_cf40AatbD6JdX8(ix3|a6bZ)^OAEi7$!Shi=4J%j`BxJM! zy5Dlx?Q@o7>W~2GE<)Xg*YVrt*KC%zYFF3Sd42=};=vLK2?F#(EDFTuA6EC)AvX=N z7j7669OBeBB}ur8vyq?F?nLfpBdK14GHg5~lr`+Q)l4z5!_;~I0Z+i&M)@^|7&uCn zP+BVRzC9GW+AZ$0ef;BQ9w7Pe)j5|fNf%85?UPY|0)1{?!myoKAs8+c|fye z{J-vmp%6I254&jY2z~{lm{JQn{&TWq$3R#mnG@pcxlD1_Qp+?e$F#8h#ooquEWGWf3sSFN-*Idc#BL2=lNjDMRNizoW2k(lLZYpu ztTHHW5_Ea`X3D(J&zpI70xkWRkyGEmE7ruPV=m)7(_vQJ!rv*$(*1C4FYe1krQgb( zbu`}GqB>G#K7KaztE#`Y*A42S`-I-;67cMLYmPoWJ-yle1C{7+Y!}o3vUjqX`AMXp z?&NJElw`S@y=xc&-(5=pVdgyPw>p29|L{6wjDVkJ_Dj0STx*btnbQ^iwU zPjzwNBRenspld=={mLE+#J1|>oax3@C60p#m%Zbk3Zz0Qr#iIbQUB^y4{M7wPqO_p zt1bp0TFnyM6I>Pkf2shfu_#}S77SE(am3aLTbiXl6p0^KLLC)&yU(reQer!QKW4x9 z*8$opE1=mP!>!+bvlos^D&9C@V1b(dhxruBPel15pY#R@D~M5XG^`p{?C43}q$ZYs zCc=H;Vy&J_^1e;_SzU5{KW@Ue*XhPlM)^(7eo8-Liqx4T982Ug+9uw+e+`y)&Pf@{~hhqoR5`NPVRqU=Pj(i@W9JL+RJ}vPNSG=tnf?BxiZ*k#6?S$@WyV~YX{RQ(Q@r_}4~5wrkChx3nkJ>f z%bw=1*(j;!^4RjboPf<5CkpVI#OO@TN9l>d=svS$Sei-upYpi>IU0Kkf$1r*Kl)iG zg_c@z3^2gLdWX0FGADt|Bl#Qf=>606U@h19O*(&#WCoHip@lD*@~^(< zc5O@Zu`^=%wqj7Pe~lggf%=8%@u$4{8~q9M!s+!(Y~IS3(`2B3)1Vw`IF;D~Yu654 zY`EXYI$;8S;U(HP=3z-+O-@N($4f4Lx>bm!@&h71d!k33I?F7e2B*6;;hN|H>f7-3 zKNEp#rph6>M9lX0RieVaykzMya)5+94x1I?<1>S{WDx|MyikWf+jLA07vXmn zAwt5-ejThO)Nf{wXo0_66!6qTB_GXWYEb23{poG3vW(YBw#Y+=pC`Y3gmI`WZ!s0} zleuKNC5Vx|j)z}usjgiAhw|aYv;BG9T79V_Nlz9a7?qDNw)!v*PKZus@tm%`lhdJf zV(C5fb6bp%Hr}b?Z9nF*E9F{67F~O&l^1;y2_5kxo8dy+WxB3)~7z9+$xb-}3jsZq&Q-5AdKcON)P9(nrv4@X1W4c5_6<8N;1d za+>x{bL~Fn6v*MjamvK(Ek*>bFmX=mdCJ~kCjPJqKhnv(&u3|5P=jS8PbK!BrN7gPEB+jr ztH7$!kVZV@DE$XP$f0|P2Y7rxB3N;CEsDf2tv8${bdM3Uzy9Rkn$~ zb7iyr5Yu>HUuftQ_07P%i%9*S;rD3ACh|sJyO{0NB9r)GOmP7_673}9;K;o~-q+Bd zp)lB5PP?j>*MbP&AV6vTBNd+IskU9gkDPN6yFFra$?$-vp`(XjY?0e8jl< zaY5mW!%e`)vZKwDEsa_5TWK!V)<2_<^5j^DF0=w#C_ppKaqmaWn$8jQ5ds(Tpo(M* z|DDRj`GGPAr&rn8qTe*;%Q*cHJ1+!fIQ&IDTT)`_QasP2@xsT|b#CB|P}e;2ljg z9spGrgo!zb$rF4b3uo+(}y(G7Ff9$8< z41GxR&SYKpa~Svv+jMA2Y`$srhjg`c?`IqgRJSWnAD*pn)19+t@YyybHt;hJXY;|< zp-C;E$eXkK%ZnbYPfU09%K}?+;M#aA#C{DWRw8z>KkA;5SIZl=7wZEL*8tUQZZOO93zE4X|>`g7t*+6DC zVad38FXGBZ0$B^rClHZDT{JP?HD85%v?&u)qzWBkOlx!qP7a$SrzUMh@nE<$kD!cjvBHo9>hb8~ zj^C^~Pk_Q+ev=SReLs<`xU*_S2mz$^_ZIF}Z7L-AqO{vOcrz!(4yDx47$@is`A%oo z*e2b(4_kduZj)Bx0Mc^kG6Aby+>IGch44Q%*iZCUf*JBkZT1CpDnu~w>e!S=Q`*{C zeKvZ%>f{Sq69#*ES%F&^CFSNJ&rpzjogk&q_2|0!1F;xAc`-9A zDgjw>5Jz}LhEAMH>4Ewas+>x}V6cn(9>)}njD)bJa8TT#)bgUXigiBRe${Xw%9SMEsTe_VYF*ME`y4qbnS3Mj#Hj1QhppJl#PWn`{SrcCqPD>?$*u*^>a}i-+6kEibg_Qjf^Nbd~ z0`NLIW1N~QW3&1Qyc4Yba_h%U1N z09t=--6^)7*x<_An^?}(4)~|x>Rbfo55;U?6wHcngY zsK?p?O&iH^D+Y-hyQictw~6D4@(KPMc1cp$$r@dJ0HvG6?_T2QIqSt zVvCQ!f@$aB-E&QCxa2Z_QlC@D{;?VmNBy+%d?Yq@N5O znIJtR!H^3HWHkPeYLbgRWK$10ei%M7*Xd}7k2)T7-EFfRN0P85w7-d0z7VUBq1>vpyi*!#bI!G!?TWn5dNb}7e;v}+X5cnpOLL{KPv<8mK=gCd!o17>jEL34 zPIVWi^_MEb4m~k;tMfR0 zbLpXD)q`Wi|6tB20PP+%(`;7AOzDbdsjqnpgC~P)f#^KJ21g&%|HPy)goZDzEl~UV zNJpu_Bdqif;uK3EgZG`_ANfDxe@M6N+Wfme@nS{kWQ#9HaFF}~P!pDkAw1SO1KSlY zhD_b^9jMOQbXsq*eNQ6ssmU&G*vq>aZx6|aIb>;y;7<8AO0L~smY)f*DiJp;J6szdMXFAF> z81hrszdI=_ttXA@s-WnDb6Ojn1)6R2!MjhirNiOhmk3jhllwW=#FB*-A@;lO@@)I? zKE1#~ZX+T{L$_6T(^FJf%I4#+uMFYV@TX^u%tmxRR)oLLt2Dg?x#QD0Qy2o}p27Ot ztQDnb!~FQ1O%%wto04^8MKJnJ6Ljyoaa*m9ikDs9F5b7-5x2coGp1;xCO=rwaGP@lbA%Qm<%#YU@l8I}sNL}gTn;9ej3;#0xRZynj3xRV zr0kLuUQMP0qob<5!jZ8*`l)r3kfEzkRIgc}Lu4x?xnVEeTu_yfL$4FF5bPV1Z5`(M z40WUi@?5NLa{6VBSu9eu zM9A*;cKvMlUB-70P7vZ;T)zoHMJxn%c1lrGho?rf;J-Tz}Cc^1*oHzLL;Ec?wSPU1pAjC)0{c5?ixVg||Nvq&tI(5K+YH@JB(qBL*lVc%;P2`zo z$9#|_gY?H*&|?!o*EdU+5aNsyn$Och%9)jy?js3JJ!xpi&uwNf#x!iK9)CYdZdS7U z7(R^UDyB1|l;NKQh6^RB@^XNy4{Eo@J9PD6k=2HnKY|vB3Zpqvc6wnM`DbYrj}&z_ z@2Szt)Tak|e--OiZi^94b1+jS9u}c2bIR?r5Ihf7K% z+LDJn&;v*!8qvi3I&0kZMVI9a*e%KU0_A@dItqL!GoZ}XZfS=*JNzEJNH!C%0O$Q* z9RIm*XDHez%udJXt+4wEKi_PUM6-GS2-t>o=Zz#edOtdm2FB<^5SyQ;$m|SE_G$H( z_CF8mHaQxVs2PXO&>+cMk%D}Vr9VWO%=($@vrLo< zAJwTj5vCg{7ajUrCqXt9*Lh49VyKT8s6R_hD$HD=x68ygK3`CC)GD*ccNf;jw1tS7%5u zhfyEt0g@?3CkSGFI1iEs1phnw4U|a0MfuwTH8Bu|n?CfRGCvP_VSF}fySqm@>LD0u VRw@)h{?7@ZAfqZ>@%nA>{{c-lM5F)! literal 17208 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 Date: Fri, 29 Sep 2023 15:14:26 -0700 Subject: [PATCH 0159/1931] draft --- docs/ide/include-cleanup-overview.md | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 412b361c74..ab5b5b9ee5 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -8,16 +8,16 @@ ms.custom: intro-overview # Clean up C++ #includes in Visual Studio Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: -- Identifies and offers to remove unused header files--improving your build time. -- Identifies and offers to add header files for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. +- Offers to remove unused header files--improving your build time. +- Offers to add header files for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. -This article provides an overview of the `#include` cleanup tool. +This article provides an introduction to the `#include` cleanup tool. ## Turn on #include cleanup Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. -Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers and add missing headers: +Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: :::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same options but also adds dimmed.:::image-end::: @@ -25,22 +25,26 @@ The Enable # include cleanup checkbox is checked. The dropdowns for Remove unuse The options are: **Refactoring only**\ -The cleanup tool offers actions it can take when you hover the mouse pointer over an `#include`. Or, place the cursor on the `#include` line and press Ctrl+period to bring up the quick action menu: +The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include` or place the cursor on the `#include` line and press Ctrl+period: :::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." :::image-end::: -**Suggestion, Warning, Error**\ -The cleanup tool offers suggestions via a suggestion, warning, or error in the Error List window. In this screenshot, the `#include` cleanup tool is configured to indicate unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: +**Suggestion, Warning, Error** -:::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window.":::The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file.":::image-end::: +The cleanup tool offers suggestions via suggestions, warnings, or errors in the Error List window. You determine which. In this screenshot, the `#include` cleanup tool is configured to indicate unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: + +:::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: +The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." +:::image-end::: **Dimmed:**\ The `#include` cleanup tool indicates unused headers by dimming the line of the unused `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu to remove the unused header. - -include-cleanup-dimmed-include.png +:::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: +The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. +:::image-end::: For the exercises in this article, Remove unused includes tags is set to **Dimmed** and add missing includes tags is set to **Refactoring only**. From ea34eeda09e87882a8b7f8c9d6fe35c744f7ffc9 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 29 Sep 2023 15:44:46 -0700 Subject: [PATCH 0160/1931] draft --- docs/ide/include-cleanup-overview.md | 5 +++-- .../media/vs2022-include-cleanup-option.png | Bin 35558 -> 53089 bytes 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index ab5b5b9ee5..a387f99c6f 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -20,14 +20,15 @@ Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor* Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: :::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: -The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same options but also adds dimmed.:::image-end::: +The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same options but also adds dimmed. +:::image-end::: The options are: **Refactoring only**\ The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include` or place the cursor on the `#include` line and press Ctrl+period: -:::image type="content" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: +:::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." :::image-end::: diff --git a/docs/ide/media/vs2022-include-cleanup-option.png b/docs/ide/media/vs2022-include-cleanup-option.png index 84e404400ed690a07692bd659c0eae723f1f6603..84770bc45481bb277f08a64e3230cdbcc0f54899 100644 GIT binary patch literal 53089 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

I~}E+0p5p4oFoeGSZ%e;4~Rs_#-ka7t#C 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

yU2cZpo66e@IV2v@J3ra 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 literal 35558 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 Date: Fri, 29 Sep 2023 16:02:34 -0700 Subject: [PATCH 0161/1931] draft --- docs/ide/include-cleanup-overview.md | 24 +++++++++++------- .../media/vs2022-include-cleanup-option.png | Bin 53089 -> 51897 bytes 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index a387f99c6f..6fdf9139df 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -20,13 +20,14 @@ Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor* Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: :::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: -The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes tags** dropdown offers the same options but also adds dimmed. +The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. :::image-end::: The options are: -**Refactoring only**\ -The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include` or place the cursor on the `#include` line and press Ctrl+period: +**Refactoring only** + +The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: :::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." @@ -34,26 +35,31 @@ When hovering the cursor over # include iostream, a light bulb appears with the **Suggestion, Warning, Error** -The cleanup tool offers suggestions via suggestions, warnings, or errors in the Error List window. You determine which. In this screenshot, the `#include` cleanup tool is configured to indicate unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: +The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In this screenshot, the `#include` cleanup tool is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: :::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." :::image-end::: -**Dimmed:**\ -The `#include` cleanup tool indicates unused headers by dimming the line of the unused `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu to remove the unused header. +**Dimmed** + +The `#include` cleanup tool indicates unused headers by dimming the line of the unused `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see an action to remove the unused header. :::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. :::image-end::: -For the exercises in this article, Remove unused includes tags is set to **Dimmed** and add missing includes tags is set to **Refactoring only**. +For the exercises in this article, **Remove unused includes suggestion level** is set to **Warning** and **Add missing includes suggestion level** is set to **Suggestion**. -There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating required header files so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup???). +There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). ## Direct vs indirect headers -First, some terminology. Direct headers are headers that you explicitly `#include` in your code. Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. Here's an example: +To understand what the include cleanup tool can do, we first need to cover some terminology: +- Direct headers are headers that you explicitly `#include` in your code. +- Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. + +Here's an example: ```cpp #include diff --git a/docs/ide/media/vs2022-include-cleanup-option.png b/docs/ide/media/vs2022-include-cleanup-option.png index 84770bc45481bb277f08a64e3230cdbcc0f54899..2cbdb0d3aa1efe7c2eb1a2f0569a616296c24a4a 100644 GIT binary patch literal 51897 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 z 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

I~}E+0p5p4oFoeGSZ%e;4~Rs_#-ka7t#C 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

yU2cZpo66e@IV2v@J3ra zBA2FTwVhxyPY*wZaUmvrR#lp`O1mkf(PNhgsqjw!a?n<4+Lu62aq};*A zxP7!fwJ%7YylhtS+^3k!10t80!Sg8v4HMb98BOb`Aa4=)-kGEMXKUxq=4YJcqLjl& zEYV;A9f76zFPV zngvvZJ|oUwc|SX#T~Kyz{q$S0XpgNT`4+I9>C?DK$+st2b`lQvo{~G#o8{;0YRu4b z_p9;tFMm=NlcMFK5GavwJ-uqB^~puKnLmczYgjn)N1*5v>3zG~>ESWSj?&mY8S3Lo zFknb(Ea)JJ76(T@1bZ=##-Kd&FlnP3eTVse!zvLq++9!3V)OCL6@z@%{`y^nT-UUH z`r6RXSb~7$ln$#B18j3D9Ct{ks$|RXN8kNi#)2|hOm%(r$Ji~Kh7B{gY(2bcA%eH6Nj3cQgg$KL zs;VyUh+2A4x16ia{^9(uYgq&UJn$uMNd;nvB2daG0?E!FLzDplir_>Mswfh-Qi1e$ z&i1t5wt9Db5dOUTeBRS0G5d9c$o2h6?^(b88uzn}T2a$G|Gp2vm&NBob;8!YX#Rje zvOYmW`KQc;jTpweqS0InWsv2<$~%By0fz~0NfpTYW0=r${?YjDfeTuw3E(Wjeg?Y? z-18l+sDp7qjIHvXaJaa=(!cqo_jJj!i*iDAJj)QPaHOIs{b^-ad@uD)BfeOdH)iHO z--=lmH!|(r(VZMTtk&3HA;r~NL}9f!6IUdCj0b>QPnMw*Rj0{S2R-Gs40Mc|j^5WG zGu`__?&bB*^KGNTZD+1}w{Zk@7Vxu+QbvS_ZIoS(wL?F`H*Kab85fXqZMO96+vRLV zYlJA(6Wbog+wxk-9)GuEzu?#1~54gX3fTCoh1dX`#X(PetV_AgO;uzinh`Xnr2P_1WBDeQ??G>!cla5ds6+*{WO+~ z^8(8`LMJe+&|>~f*$WiYxls2Po^Y^v(aAvU_s3)$iN|F-)7!uV7!hNTeX_C$TZvSK zq#Zu&Dnmvv1(knO39N}!x5eW2q;YSiH}W*~axKPSZ(tgd=Z($A@XXdop53_%6uxX@ zn(O#vTttM}40Ch4PGs1n3h^l^iF9X361a0BOx2Bl-5hz4Bw=bBac`WS^z?O|l%3Mro8Qb=XW(BjmKM-7XyElWAd2EI?!RY`RLfDZHZc_Qop|nqmv?oU%h8Yj&193eQKaT|44o z=O2?El$8{AE`I;L3VUpv`ao1%)9QJ$LRkrOnEx67dNEb7vm3LMqtk>YlO+4B)-o$~ zfe1Ah7JrncK#*%?ATowV!K(ewR!sQ=mRScZi<;feVFXy4yn^-{V%w_w!_IKez{V979m}I)Z73eMhIeY#VU5_uki@>l* zBh&7IV@k>H;LGAkmomf!1MM}e0-L(F{es0la)ZO+4-w990T{NDGhX}|Z@Q|H4jCM4 zL~%4vypb?G(Isfmz0cKKZ#Ai-=4+jJh_>wK^E$j}#uX`H3G=Gb`_*P^`7edOxJWt=voM|iL zGb52{AzG?B==2u$&-z;y^&g$ZU&@0Y(LXs~BYH8x0HIz{fRSiPK58^Sf=0t0jhE$w z+X-pbd;Jxf#HCD)qxw(~fP`KvWhB0wR~SgnZZ-9&{59wmynD<=QtQ=f&rm;pPikW& zD|Z3&MJ#2%!&(Ub!@?(u3-fRclWn7gVn@XwhTy?)4x4NXap9Bgd~>QarvgMunD+q9 z#!!nN5{r1(c8L=uwAdJ|i`BgYfSkgfoetagF8boF0KRPim|>4|5m6ZWITH*X2u(F8k6DTiBK0lbLh++WmVL@|E zeCjJgAocibU<|s+2eJSu%8U^KGlyaE3SyOi?580iq_>Y2{1(c}Wsc`sv}Kpzs!+VH zZub^bx^iOwUE^QAl9l8bVD|Hox_5j}Dc%r6A%;+8{1C<`x*9_2um5d0fgLYDtFZb_=L#d??kE zO^A$d_SmgA$X4bBHhW?kAKjPvV@AqTzP&^esc{fFr0F^Rr__eVwjP< zjfBVb^7F%}eXoky*V|soFW4-d&t!fpcX9IF$E_Ij(`=;uKuUjScLUl^dOnYWd06hB z%^7tof5NuAY0L1Xo^m_a7U+CN^CSE8P;5f)=5)-V0X&;kbBiF5Os0^7+Y7pCv(0BFSKC%K$h+%>pS=TatO_ z;2cQIikuWeomhx`H_XlbClXuHn?02)hvIdTAlDS7yLIix0t>N&xF%+I%id4E=McF8 zHXfsJ3%$)U0jqicqLE=?-4_UFiX@vWYTES&RmlE+ zf9Q91J*~O#6cj=?@a10lwu_$%j8yn6*@N9K&VxKs5QK8JT)<}=OI6J)k3_BTuWPcX z)e5|PGOIY8dfkkUNY@DO&L1R10CHj?!?L49wOb^RVOXE{zWh`JCFsdVB@0SU^TWfo2D6G$;m9=P5WMEKy{xKpp&?aWqCb3TiGywShs8+m9@p zL(SeE(_GdN4l8O#eupeJ(wAIQU!0Bx1zuvNN_4j?v?#@8s0Ss9&#+I@cVRgkWq>dn zPa{g*{e*c&JWn31d~huf*d}H1?R^BURw5!2f1GY486L1gRw;K2HsVf?R+*C#o{}?L zE^hHeOLYc$`e@^Sw10R*tMprfI&3nqKT=k0FR#Q|@i#(@<*y__nmF1uaeR@6)N*6i ze1AbNJ@eFd@+3XszFEeND4#x1(Xr2e%b415^5SMH;;yD_@odVJ59NTh{+!Co^O>;@ z=9T`suYhnAbIfl=?S_q8Q;C{hs|tZwET83#0jBp~TBSk)~$A_K3%buJ>vm?4}#j~ovPO{wjMa=TK` z+ZHv(uZ|4X%~w}y<<0hv)0dx_AGS)ZvXNId=NF!1B^T0e-0lx6uPL6Hp3I8^n#f?G z1N9ab1$@v{=Ao=JsWrKF0iP`5VGKu zHqZ3Fg|$4Z18!TR6(eE8-I9fRk1g``nTnQ26+e8BxnBoSj?+yJCxkT0ey_XFkZEGe ztvl{i_c>vZ;eVK&3yeZ|hi{LfSTMcbUh(c0{LtTFa&HUNc>OP@;7}U{#;tgSN|M{^ zb}>Oy&EGV#-@LE!+Z1($XKu7p-z$qJ!!UOFJv}qZPn0|fd=Yd;8Dz2}NHVjWXPI6B zab){=Zf4#a(DTF2?UNl@W(~5{CcfS2Imp|8x9RtcR_V&kS{{tp=c>Ec$6t3(G`&0F zcg`MV6kXIDSGouV6zArW`I}g74llr74|Y+27Opa6S&`5C=AypVaG*lJP3R33p=j{S z$q6#`vuaw^n!Hz7GRSWC9VnBr2t1Q7Z1Orgkrz}u)?PrejMDi2G-O6rmo?*hP}_Wa zk%!6xlM@5Fm{xqsOtVbXie~+B@*RB~Q~&ymvz0U+#z-hICs3cODoG!fo$_1*2u|yO(Gu0(ts+APpD&mz8~F2J+G)N9*;8B{7L zB4qt6FE0-y$FaT+Mar&4RqoT953rKGc;~lRlwHa+(0}kC?{S(8>CO~k%Dfu0Uv>By z*koZ~{VM|~MC9G?vPSwlO%~n)cL90Uf>OK)%BuSGkMQ(LigRRyg}12|KcT9E%hASi zb}dj*e!@-`RQT)m3TPy}7ka)Oz1V+Tz{@`{G%^^APwbY9~h6;SdR8$i-`#k z3W*zk<_ii$d*utt)syn^O)x*;h%%u6q7efUJqEI<1i&s$P6~IJSuS>b`xQsq`uOcy z`%_VgHQF|qxV+cg>TkJ^nOv^@F$fv%V^DlSv9p$f4pWu79tB4$zpas({WWmLrToe3 z$k!4Sxz2jrp7>9OUae)gxnG~7*gae#R2*7t0?p&_;#4upZfXcI5}NRYroY{NaQzn{ zC1@m;ZLg3;8AP6McFD0G!U{EOY;EQtY6sI;hrXe{hc_~0HM*N$Kf>V#ZrpUQUwuZ1 zDJ}hhlB}PFnF@$vrl|)8&Z0Rel!>vRr&UpbKb6h)XyEoo>Aiv<_f^gIOl0N{2LbpO zKWk#vWR-HpXC1!YcR+LzFjcNZBq%VFjj}Ke0WI)AE_r|7z}e3*fbdBO?)O~yoHdtR zw>g;pxbXuFKx}=}vR}hPZuVG-wo9)P-3r=1oc|Oyhv|Mt*Bt1VAO+3s`=Khx#z*!X`MrjV7 zkfrwn6-PVmEc1ea| zQTmKdY8DE)SgMFpKU74-gXSwYJ3yuSDHrr@jH9>=Ua;TTuA3DE3=BV2VyZTeJ8d}m z8k+E6(=00+uBfBR5tMqC-7kjoF2>k@G_yiTg>L3dmkI9Bvdvz{O;Fjr-BGjyiWMG} zUr>-FczhS=a>hHYK`uW3sCF#Zup^ZCaN$$8Y3;)9s1{ru<<+qcyA8dFDP(0ZawRUF8tUYkoUppGEn>c?>y?{u+8*-Y;PRi8)b%) z>b=Q-QaiT;7lO6IXLW>ZZ7eFn062ngz9dOyL98~G6t3apMoz3kEA8Pabj`IyTq4#o zJ!z7JV09cj_`44>eM@!(FXqG}h6g9Zvrii42h>3p^ho8iIMR*fv%29Kvk`oZR75$= zOAl3D_skGZ0+lGQfEk}_1D}Uak`qLz-!9v3tGZ9}Fy55>LT5ulV}W_DN7nW#7B|Z& zUk)tEqU~fk%3|KE<^YSqHw~G_m($^B3td8a3{Q=)x+4B%;2swC)wFmjo5CALBkj5U z->ZFk_-zUF8Izi&=s) ziZeS6Z_-tf71X*@Xu6M;s|trt2E1$?un^2^0v35b&05IBy?#r?X<|+<=}p7W#90$h z-GE9tuqf}g)L$^VqFDJ%_uzICDf}@9S&+Riq3zDD`FeW6`mSYVtw6txK1$2Tip@Eq zGl{@Hr5vgxF>efuQr0ti5A|X@nOE;3r-ln zN5y>k8QAdDjoZ@C^CN5K@twcR?Y8Zmd8k+HWfCOz>RsU)frehbS}Tax#P0p(Tx8m1j!(|G0ut_##m=u#MVhEzJ0qKOt^x!qzE#c)e^KozRK%>(CzJC7Fw@m{*+zOTdH?yI%Bcb z**;NGt~FF#LKB*Pu3n+nP6@w_5BJ6tWsr{>ty#60O}rYvvbGS#QPGSt9@+-ouZe%e)C?Vads%}}-luD1Ne;uF&?LlFYds=q=m zjBYwmRd?jD4cFoyr6ed9nhHa0u9xMU1j7{wd@_i+$zWOLstOTtpfdcj5)Io!Wrf|5 z$dQ{0WaSYEWJTaJ4>9aqT0z0Lu1d(53;lXIFDd=YQv<)VtX29D6pH@JN360R5b6W= z33fu^z~VMk(FHF3*6#%nE0@t4xA_?>`xQ!*{XLXZ_J2yE+ZwLq7TD5VJ{JNi z^j5(kkR5@vmii^$V_zh#IVY1ZE+7Lf0WjGft&;K^sR-We{f<;VQ2|2hPced8_v?vq^o(MeFNd!- z$49$XIu$`RuqL$XcEB6^LK{Tr%$D-+iuWh)49u-6BUJ8(oyQ63`DX*`HslWP??=b7 zQM$|FUuqVlLS=0i**AUPI$$GaRYO{r{?$H=numM!hDn>;iSV^(Z0o1d023 zg5u*FUAPp&yKM_X(j0sk_(`j5_8vFtadXiRi0fLRfP)T_q9 zMVBkag;Q(tL-oeHW)D5&|0opr_rQX3ffb64rt1XW5^&7gVb^y&3Y+5g?fG|MvH=)| zaI^;jAc+9RmzV!5mB^kCFB=#BHp4ln*S}X24Eh)ilm_m~Ah$tC0FSC=>eSC&pCw$# zSyKIsZbp;*DZ3RsD+2%H`y>So=Pn{^*-QSgnQq?k+UzL#{Pe#W#~;J6K?_SnqFpiN zrq^N4ky#aP zO72G{__7g0FJ6{8-SD+6E528FntvLVGXyFz0vn4+rgdUa>_ zz3IRtH2eED&f)hCe06O3w8`|F3t`hmhI zU~*~!W+N2?nV)pku+U(#!w)?3qtmk6OX^wZ$4>bb zyS5%)<$eWT6X(|k%f9cYN6m@FieC}XXDnifvr4aO>HTl!!Zd8TgHhnaS#Um4?su@j@3HUZ(s~+9S-Xi9Lm#SzGSxNWh0M^>(5pE zYn*rv|9Be>jl9ZX9-S|9h_5G<+{l9j*!yQLN7>1a7b?G_&O10NGYj|kqh7C_rH2#E1Sn@#aCWE+vvv%^R4DF_9jPGN%F^CN%yNc zv)eUv-#%BbF8%d=?!BK0EWA4Sk1FO#@5!#1;FuqcNNhX+4; zM%l)yzC4XSsG%#&`TT65hOMAQV4inC*dKE4>AnrF>z%ND=E-R8%O`AEq=mOz>FbFg zo-;o%gpi9;lfTelk~A`+O5?WMZrI5*0*p1lo-BP*Jy=T9z&crIA_gD<4!ug5rI(vh z4K@u*l{iq#uT7=kK)ow30L(9Ik%|{XVV*a?a~NM9Z5}H6bSOeLviU>R&O++|kra)D z=YzaFD(HT3N28{=)K0e}>rlUkv+i?PkiDA=P+;!o_e!mnA4j=2`$qT}X9W=-D6kX_ z4ygUwCX^dkgAYR^H1)^V!Mw9K8Z+ zpFeDDP+q_MiS-4c>X+(C{{3D{AhO%(*d|!cYr?k{@2NkiPml(azW1@F%8>@U zU>!9E&{h*3rCz^%8Q~|vVa;g_f=Mw5Et^GT6+v~mILyT`w8cC5ym!Ror}*MdN<4f| zMG+Gvw%+y*M-eU}jO+5DXiH_pEFn&RQIr8d`r8=hUkj7Jb5LPZE~3!~jda(36wV(_ zNaqt@_(I|C@exWJoobE!!u?*N09>UOt>;mJ;kVywY}X{2jD_};GNyFMTC#1ANm2+F zrHqKr5ptDR!ec5*^5D86_LVw(;Z>Tn2OH;RPg%yOTsIjlqI?OhHuWE9%`>#@P?Bx? z${De$JHv>Rrxa;BbaqneuLdtT7XbI?xI?pg8Ho~!8d#bP`X=PYLv(+}QV#1?J}75S~BA;KIMaM%ndJ3kz8|09sLnK&dwHEjUV% zza>{Z|NoM|{~{<1Ly`abKov0c0eI&(XWe7Xl?!++lz#&PYV3+&W>YwH;Er0YA`(E! ztcq=_7^*n}`7(oLO>w}#Nk6}EPWb~NrMQy(m9m;zK52{GNL_1IP+~EjK>MO*m~FXD z(yvibhAe7aMSU{PdfMZ*XT%;i;nUACc^Obly5eLiU&bHJZCrM zoB=ycVUOx!RifOPQe0=3Qvh`#_~eJq(g!gcI{vr*v<1|d#yB`%cC9(B2U6QdQ_!e+ zfA&FtTeYT%XWL>e##wmb2btD7m{twaBgtdf2J!UNuI8YZJR8eVRhr_LK9~A-H5Zp0 zYr$G;VxHT*(a++SHN|Q%L@WnR(xXw4q&&Yv>v4>O(0G%hXW|+08iHjR$&9na7~o9W z-1^gBqQC%^wdk9G_yOU_d2o93uxBkBB{!NC{7$va1}o@gmJJI=nqGeblfP7M;#Fm6 z;m7P^xX9a%>Y0~v6D8I5b<9H_7^~81Cj2C)3ULIQE9I$4$bz@Z_D$1LlWnE8v$txf z{5#iXQRnYS;sBhjGLPV)_37L9>PN`fgf|Q)i7CZy_DA=(^7_T!rF+&*&L4r{)>H?1 ze|Zp!>-|ZTme<0?)y2;18gC@okvGzZf{s4AC;WmEZvg03)n69rNr(OKWnp1=S_KEX z%qVym?5c}EUvo`2C>adNj|T4j>nRQte?)krwq;LmgL(O+uiuSG#tRjSiT~+MUB~69 zB(s?(9YL>OA5Xn6Ug~CTY{2o?VmcG;go&EjmnT^xSV}qg+Dtj^-0F>px5qzuyq@e5 z-hZWKnPPkx@Z#78lu=exMCYa}%JAz~22+aDw-?_KJxhK7xa_TP#(vMyJCk;^OcOu@ zDrx-Q3s1zu$91wJi>DDS%gkWvS+mH0`f@3gLPU|9nPgVT3P&v1QLR=a@Cm_UKZZLj z?$0dZq<5g3p0h{>_226NdOUy?H)ZfeyW~AktSJ0+1dg%|(h!U5?71aFdWl8Qmn5UA zN|M7wOX}?F3Ild%E@>KhQ(1opf$?i1Uo$(-$4Tmk-jEj8k$(e^o-JA+5wv6GKn6S- zjhEL|2qb*&Bn~WGag`+iCxm6)sg@e9+TATH`C1@Q$8~j~sJ+4b_WJeYi-{GG)tt-F z54EDu1V#3Q=xm31@7|xk)E#il2?$mR3fVVpR*z@MvWo|DUD(sJndvTf9!Y4!UO z%tD{i6&THcbva-~f>>Ah>SYnKtgO+my3i`!yAF-2;PU^eXDZhM7z3dynFeGf?PDg% zi|DcIWAM!r2!66d=b22HqQT*QU$t&BV{%Y5H z#0!{?;5I>{wXFq7%7Hk!Bxp$f?_l-+h-RDgn?2bC%dhtBvEOT&JwWKt7V{6j0g)>v z?iJxJ;CIlFEV?c_n@K~bt0L8g2FI98fsRxa1h>!d1JS9~*{R)oLptKn-(ic5Q8D*Z zs`%l2UqpTWwm=ytKWet1Y(74)iCL(7on^$%m<~L%6Rdx6O;})lXUwlrh4Npa52qIX z0ICKA%1`@aY>E4Yd(B$T=6RzukZOI&st7p+ndBXmUKI)65-E^9UyCSf zV|hW-6!s0^s1xL}$nv@CTa!%eLDh%jwHfp8hy{n|F@jCrq1~mReGfP^**`$JV0#h* ziuK*+m1&u9_pze!AN~f%uR6jNwzPXR#-hRNu`%H~a@tCtQbzdvR=<4G#vnp?^(kX+ zTOElO8_<}7679mt7D#|9;a0ILey;$dKrDwbtF&E0Lhe_?g}iHz(`wamt8~ef!~Ejz z&eHFZKo;OtYyr}qykB@a1IP7;AT@pNm=2%>o@CHSg?^iulG0J4IOR`6aJjwWk0C3@ zcw~?OTZmg+4Ec})#J(sa4wkGy#5(RV`%MDLUM$Ma%~_>LQt723>sY-l4tQ0Y{ciXr zwv{*H($di}@Nr84e6Q|n;F3)*d?qs$jx4aD7A9v6WR0v8GeTK*LFdXrYl*#7(U=&N zDh7+RZ$+@pU*rj^#-@(fXUAD>j16O}oEI|Tna})$?v&I%CS1~H&KP6HVdTHHVmpVz z7~`+jQ^r8a)J)g4n8^sPf5$z6)xfQ2Xe2>731d*i1vUzuBP(2fB9rLDr@L6wvzKk)KrD^UUdBaPigS8{F2JT%yLqc}ss zN&qFYu+umf-NEFjysOP*94UI$667+bb4qI15z0m-P9_o`Poa&SDf*rj`=u<}{8blH3% z3%I@|d1^}L)F^K)vv^EDst8Wpt8#$(027x-jodZ}_aYmq6O|9|OZfCXLcQ`2KnsXK zSL1vERBlOW#ojX^SMA}Kz}Ahb{Rs|E5^EYFd6_fL6*wvG|HYxW>&hk!4)55sMNf?U z!TV4p@RKf_{`;r>1KacfXjmllpHEm z+S<|%tNEJchH)l*4CMp&OR`t$KXA0tLXTBtI}@^o()%Ezt72tnplp|lRzir&7$GAr zKf_{bf_h)Te(`x9i;N(%Yzb8x%4&Rjv4tw)bAXB4u}`U5EFK?`&GD=WH7X%6nc&i} zWG-*%P#3a8L<%?*+dm30AvWx}5lV0&;R0maD%TYI>|;^d`izrv_rFS}1>rapZJrv- zOE4vt$z;N(;biK~Ugvm1 z?Ow1ENxbfZ4z-Vu7W*c3H6}ZrEBAU;AdSYv?ckw}`B1txpU1mkXdaSzf3$cP9ux`d z=5UPqu8z2T<@iD0>%M#AtLe6|o&J6etmCGyoPq*PMjN!R{kL&t;Ztc;yf~!NQ~m|pB`UxrKiiq zUB8VRrybu#$-Gw{98?P3m@@-y0b6L(0NYfd1-Y+>ynEZH@#gP(%~;J33AZ4Bu=gh8 zY?fO&f-kzzTN_BA*Kyw>q_Ku4L|y)V5t^j1@4gMZ=dhf;MQZ#^ucgNf34gt|)wcd6 zgWL6J05|;?PM)#Q-FVdb;qTG&PV%SdcbQ-PQd3iv-K00A@qCbgo3K=&2;Szq34*lA z<=#Di%>96qqhvUTvcsPAHAaEYc4k7()4lqFVg>zUNUHJx9P`Fk5e?XX~BU)IiPeF;bneu(Tq1S@y^?M z?=po;NfKYko3wj~7GS+q7p_N(v*n3(X3jJ=`f?zT)c(Tj^Ywhlo+HDElA2mKe(Nb5 zpv=T^f@qolR$FD=1aJ(`Z|{pZm+a~rlM0(IyD_H@y&0{VC?trD(Yn1SMK1 zQld^cnkoFtbcvW=fp)%YVPF4FDtu6^x^{(c&!UPsh8deN@Cq%AMLMwJUUikkXwl#x zl8?jBS;jbZ*Qp8=BO#0Wg}a|#)BUyMv&-y1?XlaE$S^Ent`u?lFT~JNX_q5Y zR$M3M)(6otV;K+q=q~!p8ecoq-=S)Ec<${6DX38c<`lk0LyISNXIe3>6leZgB;eA6 zL8bl4=o@(ZhXwC4zvLEz$vjC$0G)HZ{RXA7=yjSEc_fj3;Ky9iQh}XO5VH$DFdAdd zsw2&h*?vxSFO>cZ;|X+B;P;i-EOQP;uA;W^fD||X+Jr-_)cWIctaflfv~9_S zj&}BrjI3L;8P9|+dqI8^*|0rhDh*@mPWGU42FlF(+rH$Iztt?h7f>f&cB_gagpCig z!RdBnN47fnBSvIua;9?6u=Kux@KoD?RYb2YnyQv#37XD@lEb zvFf5)8INd|ijLt%R+wTT`Ht8m+nq@b0;i;IzQvGgp#?hh!nd$t7{te_q9rLsy1mf; zTB?H?wuy~#a=qwaL)|q|oB3B{p!wD0J?IiUUx9gnLL6Eer@oZ*g-C{JDFnaFZ|XN| zJi~Vs1Z#yiFx(8`@oXZ|vgyujA-&&(CVuz(ZSFSBPfyI=d$PQa|Edht;J_D?-(M$A znjS$pf(6=7SdKhb0qs=U+Q|WJw!{pB77sK)cCS}<0$uCqZ zn5cbZI>x$5RiPTultCnpeN~XC)$Trv(W<`k`5|{2&yqK4YV+g#MY`w`0*oOCEpZ;+ znNneyb;aClyd|xo1M(6cC0cLD6zv3j!`>z5lQH_*vrTB5M38i2TPQ(<4lJr1&s-@x zjP3G@yRi|sr+j&lc*?hKycm0TbR^3u-hLj7Vf@*Lql3fdA{sfGcgvs%B$ULIKpSJv zVO<-~WPAQy6^u+zcyk0n$-yO|4%nWxC~1!bFv+J*6jj)`mg=v5C3ArWyzh0#d~VQORe0}K zZqZE(+S3xEA}RVVkxfOM=atAwc(HY>Vz`IgKg_@TbSg8=d$WGV`r@X3Ef^3nI$C z=02xiN$(Goj`F_0fB|z6MQT~h70}prw97Vs3(A#I%Q>vl?dQZ-Rj@kIV~qa!A3mQC z){KLJLEV%V7g3#ezT7MUh(oE7T7eM^UX*d=8cF%rYLsqrxj^-UFW?t5F+J3IG6XAvX>hXe7o(~mRa9t zPC2YM9KNl7RPbE=vk^Ff3i}h5QNWQ7p+>tt4X;t~dYeQy*{b3266cfc{fn=gyqO!e zktpUi>Z2{>Z=`E2LPY)i4X0RFFvGompea8MfiN=H|y}5KL2reoY>ev;3 zYb=M}K!x@(1Q5=GI|WIZH(Y6BgxV-UZOl15i!m7D58hP|roVY}Ah$IFPg0=u;QA%+ zGmaqs_(}9SDkUbpx@_-{dto=fuVm496K|Ck$Pi0lWAIA@;WDEz=JaI!=RK)ltHtAs zi>0QhDn1_Djt$7s;2FJVbd!waP?gN$nkYvTH&>cqz{xOcn5421>=CGm(d`XK7FHSf zY!^kcYQDL<)byq%kPYryEYd5|3(uRVVoPf?Wz=wVautYPF{4D`=8;wnFVQw?CPy89 zowAbydS6i?_|+##L0vij!}<6SkdPHX!9xdMQr5xJkNp4?99WaZC@_|G=Nh@&nzx$}GEkw89LU0@TM#Z?CtFL^?2U^*0juaUD?fFapV)F1@+W*)nb!h&q1a*>j zn1K4nm?_m^Z0;!KUjptY(|pxBY_z(<{>&mWc^iYR`3>gdZ?k?Q-x-c(Xtop?G~_>j zE;vcZeSSlpVtYQ9c|#lImEsrW1rq4Lro;Z_mADt{wW~t?ua&7X^UTOi3+i?}$X3xt zw)|DMzPlThq2and%N+@{6#0Q1YJyC?vDG(fPY$^jA8a5T+E`nAWV>9Ti66Bt!+L0(v8 zUT0v)hx6KW76C^NaTDKJ^NG#OnDW{isH&pEqzrx|y7iyO%=*|itlbD-`Rn@7tU#rfcC1g*3m{t+Ev$v|{1JFa( zuV1kMY8)wvW-?>=&r_`lH1k4s&<15gAC1BSx6H?6r(^P@A5oU+>`_RS`|5-F&BKc9LZ>3R76 zY*D+&)!$}rHQY$_+rROAO$0x8o}}NY_31yYN&Xn_GA$uyP3_FC^E&&fgS4*+%k!Ty zOaVSlZs&1(ck;m6HtikRb}O@k zCpx_$m=FZm%HPnk?p02j2>@4-_qL@Z?V6-wF5mO zoE4=>3W=X^E5e?RGozlF97vcd9uSPyj4pvz;Uys_`AOISK6(e1ZyrnYZkUNlRo@Mk z&;kU(s78GQv7W9rvkz$_H^2N`bDxof9s{kVJi*tvLg)`Z&5PGJv-+7EgLN?bab8Pq zCRf9JRtrUsQu-@4Ai>@hFZDq%Pq1ADnLzrEV&V10N+9{GOX;TzOzsLTm6sXSBNv6f zkBCo(nw!rfm`*bYe`^Zb&qBXv2cKlM= zFWlN@bYC*?Zt~sjk#KN?y7(@hOx zy4$;d^N+($lL|N49g4&l^?18@26_$+Sul zvF#z1EAA)2a*10cICbpFeNcLr~-K4I$Q}fq5 z0+8=I8LY|K-~0p(fL9UN!Pkz_HxT}^Pm0d&2Qz!uB1Ugd#9b0G$*{(D&hx1 zVOY^@F3gsm{`kK_qVeaUv`5E*B$Z{wq-48=bh`}TdR>mneZ%#tGx#M(&c1Qs#&4m< z+&-omR34C3m~Q#3cb{_v$_&iEu%vU|VuA128h;=&Y}cG94oD|Jylv9q-jDBJ;BPka{&Auxj z+~vK8ylz>%*uHn)YF1yg=E6pJwXM#x*<*0@flwK-9&2XNr*g-)7o^<;WsqGjk;~-6 zKKj7}%tE}uwl80XK1e8f+i5YBs6Sad3$tSh7nvo!=Ua!d{tfZN5RRTUYDU;x0q|^8 z=WLq;p0vwdhU-SE)m5W05nchtQYd{St#16a6%yf`4(4L9B1U=p5=(6U82jBPws={7 zT*Lpfo1KSu_v@9*uB#|{xZMBd@s(X%H&T}^e#>H;#U8x2P2t4-_Dk{2=eL?B+jGya z0?wm|u8lDNlyq&YK&jZ)b)upv2V|Ieqj_f=sr`C+d09}5*cR!Xz`@AYyHnfi{ecScDnG=B(o1ei*pqzg28cM8PWOggJU2{TBikz(ge}HrL;2T^xF}#eV7h zowtO6^_8Qd`QsuFZCClU$U;Z9Gl~~J_!%+-i=Q^&;N*o>{G2m@gOgSg^BHHjZT)&7 z^Wx;F!jdo2rz$PCo<5_vHe*X}`m8YEZWgU?6QtWi7wVVZVoOq%`+e-AwQj@*<8|LI zyz#kyz6NZO+dlIWPxFY0j&6>OZ7ch#qS+tUsZU#UUe`i`=ZR%%;-;p zjmOaN)zPr~oM+CwOO3THnfs6@;Qq{I`yh_>1#Tl<`26(Nbt>9fD#_>iH%852IhIur zA$msi*!L8Mh=N~Lk1`>{ow-{MG!<)zEttbpHs7MLIdE^#+L)ZZtPWdp1+H57B;GtV zB`ITbF2~h8CZ9JY6*u>v_Gynhma;rF5Y!{PC85+0O2khly<0Zx{MMs-;bOHbfK8c0 zzFmu!oRlv96z%`<#o@J*m#24C?p06j1P;vfy!Y9h=B(q1V?vKpv1Df5!RfE6G;jM= z*MiRJ5H+5(@eVT&FkG(6Sp|#N0Ec2CJR+BKhgHoJ6;9EK-*|m)c}4D*A2FZSbO2Wi t_1ENGIla?H^x}&>uYnC3#g-XQ|Ffr;^{J$#|2oP51fH&bF6*2UngDdXR^I>s From 905310b038ee2a1c98f8e460b2ad1d1f30a8b63f Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 29 Sep 2023 17:09:38 -0700 Subject: [PATCH 0162/1931] draft --- docs/ide/include-cleanup-overview.md | 57 ++++++++++++------ .../media/include-cleanup-add-iostream.png | Bin 0 -> 28087 bytes .../include-cleanup-add-transitively-used.png | Bin 0 -> 17622 bytes .../include-cleanup-refactor-lightbulb.png | Bin 9522 -> 0 bytes ...s2022-include-cleanup-refactor-options.png | Bin 13806 -> 25349 bytes 5 files changed, 37 insertions(+), 20 deletions(-) create mode 100644 docs/ide/media/include-cleanup-add-iostream.png create mode 100644 docs/ide/media/include-cleanup-add-transitively-used.png delete mode 100644 docs/ide/media/include-cleanup-refactor-lightbulb.png diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 6fdf9139df..ddb2abbaae 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -8,8 +8,8 @@ ms.custom: intro-overview # Clean up C++ #includes in Visual Studio Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: -- Offers to remove unused header files--improving your build time. -- Offers to add header files for code that is only working because another header file includes the necessary header file. This reduces the brittleness of your code by removing its reliance on hidden dependencies. +- Offers to remove unused header files--improving build times. +- Offers to add header files for code that is only working because another header file includes the necessary header file. This article provides an introduction to the `#include` cleanup tool. @@ -23,7 +23,7 @@ Then use the dropdowns to configure how you want to be notified about opportunit The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. :::image-end::: -The options are: +The meaning of the suggestion level options are: **Refactoring only** @@ -35,7 +35,7 @@ When hovering the cursor over # include iostream, a light bulb appears with the **Suggestion, Warning, Error** -The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In this screenshot, the `#include` cleanup tool is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is chosen in the dropdown filter so that you can see the cleanup tool output: +The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, the `#include` cleanup tool was configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the cleanup tool output: :::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." @@ -43,19 +43,20 @@ The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC00 **Dimmed** -The `#include` cleanup tool indicates unused headers by dimming the line of the unused `#include` in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see an action to remove the unused header. +The `#include` cleanup tool indicates unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. :::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. :::image-end::: -For the exercises in this article, **Remove unused includes suggestion level** is set to **Warning** and **Add missing includes suggestion level** is set to **Suggestion**. +For the exercises in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). ## Direct vs indirect headers -To understand what the include cleanup tool can do, we first need to cover some terminology: +To understand what the include cleanup tool can do, here's some terminology: + - Direct headers are headers that you explicitly `#include` in your code. - Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. @@ -70,13 +71,13 @@ int main() } ``` -In this example, `CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` includes `limits.h` If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. It's relying on `stdlib.h` to provide it. +In this example, `CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` happens to include `limits.h` If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix issues like this. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to track in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't even used. The C++ include cleanup tool helps you find and remove these unused headers. For example: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove these unused headers. For example: ```cpp #include @@ -89,25 +90,41 @@ int main() } ``` -In this case, `#include ` is dimmed because it isn't used since `std::cout` is commented out. Hover your cursor over the dimmed `#include` to bring up the refactoring options to remove the unused header: +In the following screenshot, `#include ` is dimmed because it isn't used since `std::cout` is commented out. Hover your cursor over the dimmed `#include` to bring up the quick action lightbulb. Click the lightbulb (or choose the **Show potential fixes** link) and choose **Remove #include `, which defines `CHAR_BIT`, the code compiles. But we are getting `limits.h` indirectly through `stdlib.h`. The situation we really want is to not include `stdlib.h` because the compiler is just processing a bunch of stuff we don't need, but we do want to include `limits.h` because we are using that. The `#include` cleanup tool can help with this. -:::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include iostream, remove all unused includes, and Add all transitively used and remove all unused # includes."::: +Hover your cursor over the dimmed `#include ` to bring up the quick action lightbulb. Click the lightbulb (or choose the **Show potential fixes** link) and choose **Add all transitively used and remove all unused #includes**: + +:::image type="content" source="media/include-cleanup-add-transitively-used.png" alt-text="Three refactoring options are shown: Remove # include stdlib.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: + +This removes unused headers and adds any headers that are being used because they are indirectly included by other header files. In this case, `#include ` is added because `CHAR_BIT` is defined in that header. And `stdlib.h` is removed because we aren't using anything from it. The result is: + +```cpp +#include + +int main() +{ + int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h + //std::cout << "charSize = " << charSize; +} +``` -It might be surprising that both `stdlib.h` and `iostream` are dimmed. The reason is that nothing in `stdlib.h` is used in this file. Because it includes `#include `, which defines `CHAR_BIT`, we're relying on it indirectly. +## Add unused headers -Choose **Add all transitively used and remove all unused # includes.** to remove the unused header and add any headers that are transitively used by the code in the file. In this case, `#include ` is added because `CHAR_BIT` is defined in that header, and `stdlib.h` was indirectly including that for us. And `stdlib.h` is removed because we aren't using anything from it. +Now let's see how to add headers by uncommenting the line: `// std::cout << "charSize = " << charSize;`. This code now uses `std::cout`, but it doesn't directly include the header that defines it.Hover your cursor over that line and choose **Show potential fixes** (or click the light bulb). Then choose **Add '#include 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 literal 0 HcmV?d00001 diff --git a/docs/ide/media/include-cleanup-add-transitively-used.png b/docs/ide/media/include-cleanup-add-transitively-used.png new file mode 100644 index 0000000000000000000000000000000000000000..8074b6e79d116ffec27f4ba08e29d5bc02db9a79 GIT binary patch literal 17622 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

@C~Tvqw^)r?a7;~1vMMSfT3WaqxbW-i>s4qm ze0wM^3)#P`jJcT|(}rOa^tG9Cowt3DNCN_?*Xz;4JGb}SLjI{%XKO95C&Q7EGGa4Q z@oyX)NdOAP`MZB<%HMENez5!GrsYolhakjZWMt&>{=TDwCFif)$JW?)UKl&m_h6lY zFlL@jOj7?S0NXkhb51hq8VCRVyII}(l5>CTr+q0sdE5matPF$18Y157tDN_6T`ElAcK&uv-xf*H75VYm`wzY)<<}G{5 z$X^fwYl$62a(IzA`^l3Yk{%|T6+N>TYT*MDJV?em$;^wx!we9!{w4l+v|z!Vbvb_ z{QSIV&MZivCb1g6H!u(i0ZQlvUTp=9Pucpw@-v_BfMFay)Nwgi-RdI|AYa_Kww6AP zqkWzXL$YI5RJpJNbbzAd6emH36FzX|ZD2s^yyl3xw6w&+!m@dBabYv#2R>5;U?HQuGO>+jnh#?AbX99m3)|e*~z8<1@aXq^qPOPs5f&c*prXX^iQA-?nD6L6?6C_Ij%9 z*SbOv^g-0rvlt+C^U+P6cFN7P$nRvIX75_Bc7~$j6q~AvvUI|nIu1Phiq!GFw?>nd z|4#tl0U-WTsT>Xrc5TdTHg`i19r}`Wr-$>q;i2v46$k_Z!Bxju067aK=fAC$vpXgL z4q;;VjI(Q4U=>96UA6UkJtmW>g*ngeK?hc?tLuVDrAAE--)A0YPShX*Ji1(yKp+qZ zek3{~c%1V(d&jxbi0neeSr91{3Wo{MWHLF-fcCuhk9`iR>w;+T|Kqz%e_mX0H-U4e zuw8x=F;gTE2n0VJ?83zUzuj5EIhK&K5VB)8@2ONO$2^gJ-A1*|O3zt>#0R*~LxJU_jM006X?6%{vZHB@!E z!MzS{@hdN&>FG$5Si0U{{zCu&TCZ#cR0pp@^w_U79w*vfX4-9*b>!DL~(J@ zX(1(9O0PKpKoGA&)E~~3=XFm70MJE2590v<5Q>NK0052Zy{*SL000eOYYqU=s1NzU VfZ^@PaYO(B002ovPDHLkV1gK7Yz+Va literal 0 HcmV?d00001 diff --git a/docs/ide/media/include-cleanup-refactor-lightbulb.png b/docs/ide/media/include-cleanup-refactor-lightbulb.png deleted file mode 100644 index 46054e98943addc38b895f6de3f7297b20a3a22e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9522 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 VRw@)h{?7@ZAfqZ>@%nA>{{c-lM5F)! diff --git a/docs/ide/media/vs2022-include-cleanup-refactor-options.png b/docs/ide/media/vs2022-include-cleanup-refactor-options.png index f7c1094005f2832752bb14b541a049f0891903c3..2026dfc867b91b1a3e9547e673296381148aa039 100644 GIT binary patch literal 25349 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 literal 13806 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 From 8510555e4f0ea7dcc0caf41c5913562e2417ef40 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Fri, 29 Sep 2023 17:19:10 -0700 Subject: [PATCH 0163/1931] draft --- docs/ide/include-cleanup-overview.md | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index ddb2abbaae..0a0a500c9a 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -114,15 +114,7 @@ int main() } ``` -## Add unused headers - -Now let's see how to add headers by uncommenting the line: `// std::cout << "charSize = " << charSize;`. This code now uses `std::cout`, but it doesn't directly include the header that defines it.Hover your cursor over that line and choose **Show potential fixes** (or click the light bulb). Then choose **Add '#include Date: Fri, 29 Sep 2023 17:36:00 -0700 Subject: [PATCH 0164/1931] draft --- docs/ide/include-cleanup-overview.md | 17 ++++++++++------- .../ide/media/include-cleanup-add-iostream.png | Bin 28087 -> 0 bytes .../include-cleanup-refactor-lightbulb.png | Bin 0 -> 19395 bytes 3 files changed, 10 insertions(+), 7 deletions(-) delete mode 100644 docs/ide/media/include-cleanup-add-iostream.png create mode 100644 docs/ide/media/include-cleanup-refactor-lightbulb.png diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 0a0a500c9a..ffd63b6a96 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -49,7 +49,7 @@ The `#include` cleanup tool indicates unused headers by dimming the line of the The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. :::image-end::: -For the exercises in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. +For the exercise in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). @@ -60,7 +60,7 @@ To understand what the include cleanup tool can do, here's some terminology: - Direct headers are headers that you explicitly `#include` in your code. - Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. -Here's an example: +Here's an example of using an indirect header: ```cpp #include @@ -71,13 +71,13 @@ int main() } ``` -In this example, `CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` happens to include `limits.h` If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. +`CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` happens to include `limits.h`. If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix issues like this. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove these unused headers. For example: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example: ```cpp #include @@ -96,13 +96,13 @@ In the following screenshot, `#include ` is dimmed because it isn't us ## Add transitively used headers -It might be surprising that both `stdlib.h` and `iostream` are dimmed. The reason that `stdlib.h` is dimmed is because it isn't used in this file. Because `stdlib.h` includes ``, which defines `CHAR_BIT`, the code compiles. But we are getting `limits.h` indirectly through `stdlib.h`. The situation we really want is to not include `stdlib.h` because the compiler is just processing a bunch of stuff we don't need, but we do want to include `limits.h` because we are using that. The `#include` cleanup tool can help with this. +It might be surprising that both `stdlib.h` and `iostream` were dimmed. The reason that `stdlib.h` is dimmed is because it isn't used in this file. But because `stdlib.h` includes ``, which defines `CHAR_BIT`, the code compiles. But we are getting `limits.h` indirectly through `stdlib.h`. The situation we really want is to not include `stdlib.h` because the compiler is just processing extra stuff we don't need, but we do want to include `limits.h` because we are using that. The `#include` cleanup tool can help with this. Hover your cursor over the dimmed `#include ` to bring up the quick action lightbulb. Click the lightbulb (or choose the **Show potential fixes** link) and choose **Add all transitively used and remove all unused #includes**: :::image type="content" source="media/include-cleanup-add-transitively-used.png" alt-text="Three refactoring options are shown: Remove # include stdlib.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: -This removes unused headers and adds any headers that are being used because they are indirectly included by other header files. In this case, `#include ` is added because `CHAR_BIT` is defined in that header. And `stdlib.h` is removed because we aren't using anything from it. The result is: +This removes unused headers and adds any used headers that are indirectly included by other header files. In this case, `#include ` is added because `CHAR_BIT` is defined in that header. And `stdlib.h` is removed because we aren't using anything from it. The result is: ```cpp #include @@ -114,7 +114,10 @@ int main() } ``` -In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, add headers that were indirectly included by other headers so that now your code follows best practices and is less brittle, and add missing headers. For a practical introduction to improving code quality and build times, see [Cleanup tool walkthrough - TBD naming](link-somewhere). For more information about customizing how the #include cleanup generates suggestions for your project and across your team, see [Cleanup tool configuration reference](link-somewhere). +In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, add headers that were indirectly included by other headers so that now your code follows best practices and is less brittle, and add missing headers. + +For a practical introduction to improving code quality and build times, see [Cleanup tool walkthrough - TBD naming](link-somewhere).\ +For more information about customizing how the #include cleanup generates suggestions for your project and across your team, see [Cleanup tool configuration reference](link-somewhere). ## See also diff --git a/docs/ide/media/include-cleanup-add-iostream.png b/docs/ide/media/include-cleanup-add-iostream.png deleted file mode 100644 index 24f0225daf48a26b73b4056b979dfe25546b6f9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28087 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 diff --git a/docs/ide/media/include-cleanup-refactor-lightbulb.png b/docs/ide/media/include-cleanup-refactor-lightbulb.png new file mode 100644 index 0000000000000000000000000000000000000000..9a5aff92cedcfb77d55c939eb8024f15c5898d0e GIT binary patch literal 19395 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 Date: Sat, 30 Sep 2023 17:40:44 +0800 Subject: [PATCH 0165/1931] Merge code blocks for C2504 --- .../compiler-errors-2/compiler-error-c2504.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/docs/error-messages/compiler-errors-2/compiler-error-c2504.md b/docs/error-messages/compiler-errors-2/compiler-error-c2504.md index d20e2ff8b2..454446e651 100644 --- a/docs/error-messages/compiler-errors-2/compiler-error-c2504.md +++ b/docs/error-messages/compiler-errors-2/compiler-error-c2504.md @@ -10,7 +10,7 @@ ms.assetid: c9e002a6-a4ee-4ba7-970e-edf4adb83692 'class' : base class undefined -The base class is declared but never defined. Possible causes: +The base class is declared but never defined. Possible causes: 1. Missing include file. @@ -23,11 +23,7 @@ The following sample generates C2504: // compile with: /c class A; class B : public A {}; // C2504 -``` - -// OK -``` -class C{}; -class D : public C {}; +class C {}; +class D : public C {}; // OK ``` From 656dcf10ab060f1071cd5ffa0ba52b729ddb3164 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:12:07 +0800 Subject: [PATCH 0166/1931] Add example for C2510 --- .../compiler-errors-2/compiler-error-c2510.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/error-messages/compiler-errors-2/compiler-error-c2510.md b/docs/error-messages/compiler-errors-2/compiler-error-c2510.md index 3d234c77f0..6f3e7b8c2a 100644 --- a/docs/error-messages/compiler-errors-2/compiler-error-c2510.md +++ b/docs/error-messages/compiler-errors-2/compiler-error-c2510.md @@ -11,3 +11,18 @@ ms.assetid: bf6d28db-f2f4-48f8-8f4e-7d662ed278fe 'identifier' : left of '::' must be a class/struct/union A class, structure, or union name must appear on the left side of the scope-resolution operator (`::`) operator. + +The following sample generates C2510: + +```cpp +// C2510.cpp +struct S { + static const int x = 1; +}; + +int main() { + S s; + int num1 = s::x; // C2510 + int num2 = S::x; // OK +} +``` From b25507bfd6266a689865db64acb9c4042aede665 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 18:30:25 +0800 Subject: [PATCH 0167/1931] Improve example for C2061 --- .../compiler-errors-1/compiler-error-c2061.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2061.md b/docs/error-messages/compiler-errors-1/compiler-error-c2061.md index 2a79f1cd5a..e200eed1ee 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2061.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2061.md @@ -20,11 +20,18 @@ The following sample generates C2061: ```cpp // C2061.cpp -// compile with: /c -template < A a > // C2061 -// try the following line instead -// template < typename b > -class c{}; +// compile with: /c /std:c++17 +template // C2061 +// Replace identifier `A` with `typename`: +// template +class C1 {}; + +template +class C2 { + // Both are valid since C++20 + using Type1 = T::Type; // C2061 + using Type2 = typename T::Type; // OK +}; ``` C2061 can occur if you pass an instance name to [typeid](../../extensions/typeid-cpp-component-extensions.md): From 87e490f5d8c6e2a9d6bea7b1f4b2398df0252e53 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:05:14 +0800 Subject: [PATCH 0168/1931] Add part on `alignof` --- .../compiler-errors-1/compiler-error-c2061.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2061.md b/docs/error-messages/compiler-errors-1/compiler-error-c2061.md index e200eed1ee..4f1a42e19f 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2061.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2061.md @@ -20,7 +20,7 @@ The following sample generates C2061: ```cpp // C2061.cpp -// compile with: /c /std:c++17 +// compile with: /std:c++17 template // C2061 // Replace identifier `A` with `typename`: // template @@ -32,6 +32,13 @@ class C2 { using Type1 = T::Type; // C2061 using Type2 = typename T::Type; // OK }; + +int main() { + int x; + unsigned a1 = alignof(x); // C2061 + unsigned a2 = alignof(int); // OK + unsigned a3 = alignof(decltype(x)); // OK +} ``` C2061 can occur if you pass an instance name to [typeid](../../extensions/typeid-cpp-component-extensions.md): From 5f29a815d6a359b0abb80eb5def48c552df6a135 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:24:58 +0800 Subject: [PATCH 0169/1931] Add example for C2058 --- .../compiler-errors-1/compiler-error-c2058.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2058.md b/docs/error-messages/compiler-errors-1/compiler-error-c2058.md index d8aa9725a7..d8ac2f081a 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2058.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2058.md @@ -11,3 +11,16 @@ ms.assetid: 81e08e6b-15f7-41b4-980a-53763e19990c constant expression is not integral The context requires an integer constant expression. + +The following sample generates C2058: + +```cpp +// C2058.cpp +struct alignas(1.5) S {}; // C2058 + +int main() { + int arr[1.5]; // C2058 +} +``` + +Possible resolutions include removing the construct or modifying the operand to an appropriate integer constant expression. From 24f8a1a781e41d017422fa38028c1d7d8324b1ee Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sat, 30 Sep 2023 23:29:59 +0800 Subject: [PATCH 0170/1931] Update C2345 --- .../compiler-errors-1/compiler-error-c2345.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2345.md b/docs/error-messages/compiler-errors-1/compiler-error-c2345.md index 50933b2e64..8661d974a0 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2345.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2345.md @@ -12,11 +12,12 @@ align(value) : illegal alignment value You passed a value to the [align](../../cpp/align-cpp.md) keyword that is outside the allowable range. -The following code generates C2345 +The following sample generates C2345: ```cpp // C2345.cpp // compile with: /c -__declspec(align(0)) int a; // C2345 -__declspec(align(1)) int a; // OK +__declspec(align(0)) int a; // OK +__declspec(align(8)) int b; // OK +__declspec(align(16384)) int c; // C2345 ``` From ce6f33435582d1d1b97b5f565e60a2329b5b5225 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sun, 1 Oct 2023 01:43:52 +0800 Subject: [PATCH 0171/1931] Create `alignas` specifier page --- docs/cpp/align-cpp.md | 2 +- docs/cpp/alignas-specifier.md | 99 ++++++++++++++++++++++++++ docs/cpp/alignment-cpp-declarations.md | 4 +- docs/cpp/toc.yml | 2 + 4 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 docs/cpp/alignas-specifier.md diff --git a/docs/cpp/align-cpp.md b/docs/cpp/align-cpp.md index 3f3a3411d6..bb2f53c801 100644 --- a/docs/cpp/align-cpp.md +++ b/docs/cpp/align-cpp.md @@ -7,7 +7,7 @@ helpviewer_keywords: ["align __declspec keyword", "__declspec keyword [C++], ali --- # `align` (C++) -In Visual Studio 2015 and later, use the C++11 standard **`alignas`** specifier to control alignment. For more information, see [Alignment](../cpp/alignment-cpp-declarations.md). +In Visual Studio 2015 and later, use the C++11 standard [**`alignas`** specifier](../cpp/alignas-specifier.md) to control alignment. **Microsoft Specific** diff --git a/docs/cpp/alignas-specifier.md b/docs/cpp/alignas-specifier.md new file mode 100644 index 0000000000..2dc821e966 --- /dev/null +++ b/docs/cpp/alignas-specifier.md @@ -0,0 +1,99 @@ +--- +description: "Learn more about: alignas Specifier" +title: "alignas Specifier" +ms.date: "09/30/2023" +f1_keywords: ["alignas"] +helpviewer_keywords: ["alignas [C++]", "alignment of structures", "__alignof keyword [C++]", "alignof [C++]", "types [C++], alignment requirements"] +--- +# `alignas` Specifier + +The **`alignas`** specifier changes the alignment of a type or object. You should prefer usage of **`alignas`** over [`__declspec(align(#))`](align-cpp.md) for code portability. + +## Syntax + +```cpp +alignas( type-id ) +alignas( expression ) +alignas( pack... ) +``` + +## Remarks + +You can use **`alignas`** specifier on a **`struct`**, **`class`**, **`union`**, or variable declaration. For `alignas( expression )`, the expression must be an integral constant expression that are powers of 2 (1, 2, 4, 8, 16, 32, 64...) or equal to `0`. All other expressions are ill-formed. A common use-case would be to control the alignment of a user-defined type as follows: + +```cpp +struct alignas(8) S1 +{ + int x; +}; + +static_assert(alignof(S1) == 8, "alignof(S1) should be 8"); +``` + +See [`alignof`](alignof-operator.md) for more infomation about how to get the alignment value. When multiple **`alignas`** target the same declaration, the strictest alignment requirement will be taken (largest value). When the integral constant expression is `0`, the **`alignas`** will be ignored. + +```cpp +class alignas(4) alignas(16) C1 {}; + +// `alignas(0)` ignored +union alignas(0) U1 +{ + int i; + float f; +}; + +union U2 +{ + int i; + float f; +}; + +static_assert(alignof(C1) == 16, "alignof(C1) should be 16"); +static_assert(alignof(U1) == alignof(U2), "alignof(U1) should be equivalent to alignof(U2)"); +``` + +Instead of using an integral constant for the alignment value, you may also choose to supply a type: + +```cpp +struct alignas(double) S2 +{ + int x; +}; + +static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)"); +``` + +As seen from the [`static_assert`](static-assert.md), `alignas( type-id )` is analogous to `alignas(alignof( type ))` (identical to using an integral constant expression of the result). + +A template parameter pack can also be used (`alignas ( pack... )`). It functions on the same concept where only the strictest alignment is effective. + +```cpp +template +class alignas(Ts...) C2 +{ + char c; +}; + +static_assert(alignof(C2<>) == 1, "alignof(C2<>) should be 1"); +// Empty angle brackets can be omitted since C++17 +// static_assert(alignof(C2) == 1, "alignof(C2) should be 1"); +static_assert(alignof(C2) == 4, "alignof(C2) should be 4"); +static_assert(alignof(C2) == 8, "alignof(C2) should be 8"); +``` + +The resulting alignment (largest) of all the **`alignas`** (if more than 1) cannot be less than the natural alignment (without having any **`alignas`** specifier). Declaration and definition of user-defined types must match in alignment requirement. + +```cpp +// Declaration of `C3` +class alignas(16) C3; + +// Definition of `C3` (with differing alignment requirement) +class alignas(32) C3 {}; // C2023, 'C3': Alignment (32) different from prior declaration (16) + +int main() +{ + alignas(2) int x; // ill-formed, since the natural alignment of `int` is 4 +} +``` + +For more information, see error [C2023](../error-messages/compiler-errors-1/compiler-error-c2023.md) and warning [C4359](../error-messages/compiler-warnings/compiler-warning-level-3-c4359.md). \ No newline at end of file diff --git a/docs/cpp/alignment-cpp-declarations.md b/docs/cpp/alignment-cpp-declarations.md index 0219a84e4d..aa3a010fee 100644 --- a/docs/cpp/alignment-cpp-declarations.md +++ b/docs/cpp/alignment-cpp-declarations.md @@ -8,7 +8,7 @@ ms.assetid: a986d510-ccb8-41f8-b905-433df9183485 One of the low-level features of C++ is the ability to specify the precise alignment of objects in memory to take maximum advantage of a specific hardware architecture. By default, the compiler aligns class and struct members on their size value: **`bool`** and **`char`** on 1-byte boundaries, **`short`** on 2-byte boundaries, **`int`**, **`long`**, and **`float`** on 4-byte boundaries, and **`long long`**, **`double`**, and **`long double`** on 8-byte boundaries. -In most scenarios, you never have to be concerned with alignment because the default alignment is already optimal. In some cases, however, you can achieve significant performance improvements, or memory savings, by specifying a custom alignment for your data structures. Before Visual Studio 2015 you could use the Microsoft-specific keywords **`__alignof`** and **`__declspec(align)`** to specify an alignment greater than the default. Starting in Visual Studio 2015 you should use the C++11 standard keywords **`alignof`** and **`alignas`** for maximum code portability. The new keywords behave in the same way under the hood as the Microsoft-specific extensions. The documentation for those extensions also applies to the new keywords. For more information, see [`alignof` Operator](../cpp/alignof-operator.md) and [align](../cpp/align-cpp.md). The C++ standard doesn't specify packing behavior for alignment on boundaries smaller than the compiler default for the target platform, so you still need to use the Microsoft [`#pragma pack`](../preprocessor/pack.md) in that case. +In most scenarios, you never have to be concerned with alignment because the default alignment is already optimal. In some cases, however, you can achieve significant performance improvements, or memory savings, by specifying a custom alignment for your data structures. Before Visual Studio 2015 you could use the Microsoft-specific keywords **`__alignof`** and **`__declspec(align)`** to specify an alignment greater than the default. Starting in Visual Studio 2015 you should use the C++11 standard keywords **`alignof`** and **`alignas`** for maximum code portability. The new keywords behave in the same way under the hood as the Microsoft-specific extensions. The documentation for those extensions also applies to the new keywords. For more information, see [`alignof` Operator](../cpp/alignof-operator.md), [`alignas` Specifier](../cpp/alignas-specifier.md) and [align](../cpp/align-cpp.md). The C++ standard doesn't specify packing behavior for alignment on boundaries smaller than the compiler default for the target platform, so you still need to use the Microsoft [`#pragma pack`](../preprocessor/pack.md) in that case. Use the [aligned_storage class](../standard-library/aligned-storage-class.md) for memory allocation of data structures with custom alignments. The [aligned_union class](../standard-library/aligned-union-class.md) is for specifying alignment for unions with non-trivial constructors or destructors. @@ -92,7 +92,7 @@ adr offset element ## `alignof` and `alignas` -The **`alignas`** type specifier is a portable, C++ standard way to specify custom alignment of variables and user defined types. The **`alignof`** operator is likewise a standard, portable way to obtain the alignment of a specified type or variable. +The **`alignas`** specifier is a portable, C++ standard way to specify custom alignment of variables and user defined types. The **`alignof`** operator is likewise a standard, portable way to obtain the alignment of a specified type or variable. ## Example diff --git a/docs/cpp/toc.yml b/docs/cpp/toc.yml index bc6350835c..e71da1fc81 100644 --- a/docs/cpp/toc.yml +++ b/docs/cpp/toc.yml @@ -122,6 +122,8 @@ items: href: ../cpp/decltype-cpp.md - name: Attributes href: ../cpp/attributes.md + - name: alignas specifier + href: ../cpp/alignas-specifier.md - name: Built-in operators, precedence, and associativity items: - name: Built-in operators, precedence, and associativity From ee8cd9d5bb75be2f9b4cae24a396e0476417f1ef Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sun, 1 Oct 2023 02:14:41 +0800 Subject: [PATCH 0172/1931] Add misc links --- docs/cpp/align-cpp.md | 2 +- docs/cpp/alignas-specifier.md | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/cpp/align-cpp.md b/docs/cpp/align-cpp.md index bb2f53c801..3d8a22d187 100644 --- a/docs/cpp/align-cpp.md +++ b/docs/cpp/align-cpp.md @@ -7,7 +7,7 @@ helpviewer_keywords: ["align __declspec keyword", "__declspec keyword [C++], ali --- # `align` (C++) -In Visual Studio 2015 and later, use the C++11 standard [**`alignas`** specifier](../cpp/alignas-specifier.md) to control alignment. +In Visual Studio 2015 and later, use the C++11 standard [**`alignas`** specifier](../cpp/alignas-specifier.md) to control alignment. For more information, see [Alignment](../cpp/alignment-cpp-declarations.md). **Microsoft Specific** diff --git a/docs/cpp/alignas-specifier.md b/docs/cpp/alignas-specifier.md index 2dc821e966..cbb44db194 100644 --- a/docs/cpp/alignas-specifier.md +++ b/docs/cpp/alignas-specifier.md @@ -7,7 +7,7 @@ helpviewer_keywords: ["alignas [C++]", "alignment of structures", "__alignof key --- # `alignas` Specifier -The **`alignas`** specifier changes the alignment of a type or object. You should prefer usage of **`alignas`** over [`__declspec(align(#))`](align-cpp.md) for code portability. +The **`alignas`** specifier changes the alignment of a type or object. You should prefer usage of **`alignas`** over [`__declspec(align(#))`](align-cpp.md) for code portability. For more information, see [Alignment](../cpp/alignment-cpp-declarations.md). ## Syntax @@ -96,4 +96,8 @@ int main() } ``` -For more information, see error [C2023](../error-messages/compiler-errors-1/compiler-error-c2023.md) and warning [C4359](../error-messages/compiler-warnings/compiler-warning-level-3-c4359.md). \ No newline at end of file +For more information, see error [C2023](../error-messages/compiler-errors-1/compiler-error-c2023.md) and warning [C4359](../error-messages/compiler-warnings/compiler-warning-level-3-c4359.md). + +## See also + +[`#pragma pack`](../preprocessor/pack.md) From 33976b5391c97a5a38622438b1345e3b964acce3 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sun, 1 Oct 2023 02:24:55 +0800 Subject: [PATCH 0173/1931] Update link from keywords cpp --- docs/cpp/keywords-cpp.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/cpp/keywords-cpp.md b/docs/cpp/keywords-cpp.md index f6d042ba48..5c0b32ebda 100644 --- a/docs/cpp/keywords-cpp.md +++ b/docs/cpp/keywords-cpp.md @@ -14,7 +14,7 @@ Keywords are predefined reserved identifiers that have special meanings. They ca :::row::: :::column::: - [`alignas`](align-cpp.md)\ + [`alignas`](alignas-specifier.md)\ [`alignof`](alignof-operator.md)\ [`and`](logical-and-operator-amp-amp.md) b\ [`and_eq`](assignment-operators.md) b\ From de37bf1acf78327dff296217eab2545cb696ef4a Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Sun, 1 Oct 2023 22:44:17 +0800 Subject: [PATCH 0174/1931] Clean up C2397 --- .../compiler-errors-1/compiler-error-c2397.md | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/docs/error-messages/compiler-errors-1/compiler-error-c2397.md b/docs/error-messages/compiler-errors-1/compiler-error-c2397.md index c73c5fe9b3..271763d69f 100644 --- a/docs/error-messages/compiler-errors-1/compiler-error-c2397.md +++ b/docs/error-messages/compiler-errors-1/compiler-error-c2397.md @@ -15,26 +15,22 @@ The C language allows implicit narrowing conversions in assignments and initiali A narrowing conversion can be okay when you know the possible range of converted values can fit in the target. In this case, you know more than the compiler does. If you make a narrowing conversion intentionally, make your intentions explicit by using a static cast. Otherwise, this error message almost always indicates you have a bug in your code. You can fix it by making sure the objects you initialize have types that are large enough to handle the inputs. -The following sample generates C2397 and shows one way to fix it: - -``` -// C2397.cpp -- C++ narrowing conversion diagnostics -// Compile by using: cl /EHsc C2397.cpp -#include - -struct S1 { - int m1; - double m2, m3; +The following sample generates C2397: + +```cpp +// C2397.cpp +// compile with: /c +struct S { + int m1; + double m2, m3; }; -void function_C2397(double d1) { - char c1 { 127 }; // OK - char c2 { 513 }; // error C2397 - - std::vector vS1; - vS1.push_back({ d1, 2, 3 }); // error C2397 - - // Possible fix if you know d1 always fits in an int - vS1.push_back({ static_cast(d1), 2, 3 }); +void func(double d1) { + char c1 { 127 }; // OK + char c2 { 513 }; // C2397 + + S arr[2]{}; + arr[0] = { d1, 2.0, 3.0 }; // C2397 + arr[1] = { static_cast(d1), 2.0, 3.0 }; // OK } ``` From 95dc0fb2ac3e2bb7133f7eb51b79a3b6170d695d Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Tue, 3 Oct 2023 21:45:13 +0800 Subject: [PATCH 0175/1931] Update C2993 --- .../compiler-errors-2/compiler-error-c2993.md | 48 ++++++++++++------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/docs/error-messages/compiler-errors-2/compiler-error-c2993.md b/docs/error-messages/compiler-errors-2/compiler-error-c2993.md index 27ca013f1e..74f56a868b 100644 --- a/docs/error-messages/compiler-errors-2/compiler-error-c2993.md +++ b/docs/error-messages/compiler-errors-2/compiler-error-c2993.md @@ -1,7 +1,7 @@ --- description: "Learn more about: Compiler Error C2993" title: "Compiler Error C2993" -ms.date: "11/04/2016" +ms.date: "10/03/2023" f1_keywords: ["C2993"] helpviewer_keywords: ["C2993"] ms.assetid: 4ffd2b78-654b-46aa-95a6-b62101cf91c8 @@ -10,34 +10,50 @@ ms.assetid: 4ffd2b78-654b-46aa-95a6-b62101cf91c8 'identifier' : illegal type for non-type template parameter 'parameter' -You cannot declare a template with a structure or union argument. Use pointers to pass structures and unions as template parameters. +You cannot declare a template with a structure, class or union argument. However, pointers can be used in place of those types as template parameters. Since C++20, structure, class or unions can be used as non-type template parameters. The following sample generates C2993: ```cpp // C2993.cpp -// compile with: /c -// C2993 expected -struct MyStruct { - int a;char b; -}; +// compile with: /c /std:c++17 +struct MyStruct {}; -template // C2993 +template // C2993 +class MyClass1 {}; -// try the following line instead -// template -class CMyClass {}; +template // OK +class MyClass2 {}; ``` -This error will also be generated as a result of compiler conformance work that was done in Visual Studio .NET 2003: floating point non-type template parameters no longer allowed. The C++ standard does not allow floating point non-type template parameters. +> [!NOTE] +> The sample above no longer emits C2993 since MSVC v19.26 and instead shows C7592. + +With C++17 and earlier, you cannot have floating point non-type template parameters. Since C++20, floating point non-type template parameters are allowed as with literal class types. -If it is a function template, use a function argument to pass in the floating point non-type template parameter (this code will be valid in the Visual Studio .NET 2003 and Visual Studio .NET versions of Visual C++). If it is a class template, there is no easy workaround. +If it is a function template, use a function argument to pass in the floating point non-type template parameter. ```cpp // C2993b.cpp +// compile with: /c /std:c++17 +template // C2993 +void func1(T t) {} + +template // OK +void func2(T t, float F) {} +``` + +> [!NOTE] +> The sample above no longer emits C2993 since MSVC v19.26 and instead shows C7592. + +Non-type template parameters cannot be of rvalue reference type. Similarly, a parameter pack of such types are not allowed. + +```cpp +// C2993c.cpp // compile with: /c -template void func(T) {} // C2993 +template // C2993 +struct S1 {}; -// OK -template void func2(T, float) {} +template // C2993 +struct S2 {}; ``` From 1164aaf25970ea62adbc37921fb0f063209e6a20 Mon Sep 17 00:00:00 2001 From: Rageking8 <106309953+Rageking8@users.noreply.github.com> Date: Tue, 3 Oct 2023 22:08:32 +0800 Subject: [PATCH 0176/1931] Split code blocks for C2992 --- .../compiler-errors-2/compiler-error-c2992.md | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/docs/error-messages/compiler-errors-2/compiler-error-c2992.md b/docs/error-messages/compiler-errors-2/compiler-error-c2992.md index 228162b189..2220dec821 100644 --- a/docs/error-messages/compiler-errors-2/compiler-error-c2992.md +++ b/docs/error-messages/compiler-errors-2/compiler-error-c2992.md @@ -20,30 +20,34 @@ The following sample generates C2992: // C2992.cpp // compile with: /c template -struct TC1 { +struct Outer { template - struct TC2; + struct Inner; }; -template struct TC1::TC2 {}; // C2992 +template // C2992 +struct Outer::Inner {}; -// OK template -template -struct TC1::TC2 {}; -// C2992 can also occur when using generics: -// C2992c.cpp -// compile with: /clr /c +template // OK +struct Outer::Inner {}; +``` + +C2992 can also occur when using generics: + +```cpp +// C2992b.cpp +// compile with: /c /clr generic -ref struct GC1 { +ref struct Outer { generic - ref struct GC2; + ref struct Inner; }; -generic ref struct GC1::GC2 {}; // C2992 +generic // C2992 +ref struct Outer::Inner {}; -// OK generic -generic -ref struct GC1::GC2 {}; +generic // OK +ref struct Outer::Inner {}; ``` From 678fd1167455f358aeba3c3e6e50478d63944b29 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 3 Oct 2023 14:37:22 -0700 Subject: [PATCH 0177/1931] refactor for an example --- docs/ide/include-cleanup-config.md | 58 +++++++++ docs/ide/include-cleanup-overview.md | 114 ++++++++---------- .../include-cleanup-add-transitively-used.png | Bin 17622 -> 0 bytes ...s2022-include-cleanup-refactor-options.png | Bin 25349 -> 36304 bytes docs/ide/toc.yml | 2 + 5 files changed, 109 insertions(+), 65 deletions(-) create mode 100644 docs/ide/include-cleanup-config.md delete mode 100644 docs/ide/media/include-cleanup-add-transitively-used.png diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md new file mode 100644 index 0000000000..f6db730e39 --- /dev/null +++ b/docs/ide/include-cleanup-config.md @@ -0,0 +1,58 @@ +--- +title: "Config the C++ #include cleanup tool" +description: "Learn how to configure the C++ include cleanup tool for individual users and for your team." +ms.date: 10/10/2023 +ms.topic: "how-to" +ms.custom: intro-overview +--- +# Config the C++ #include tool in Visual Studio + +Starting with Visual Studio 17.7 preview 3, Visual Studio provides the `#include` cleanup tool to improve the quality of your code in the following ways: +- Offers to remove unused header files--improving build times. +- Offers to add header files for code that is only working because another header file includes the necessary header file. + +This article describes how to configure the `#include` cleanup tool. For more information about the `#include` clean tool, see [Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview). + +## Turn on #include cleanup + +The `#include` cleanup tool is on by default. If it isn't active, you can turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. + +Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: + +:::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: +The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. +:::image-end::: + +The meaning of the suggestion level options are: + +**Refactoring only** + +The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: + +:::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: +When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." +:::image-end::: + +**Suggestion, Warning, Error** + +The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, the `#include` cleanup tool was configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the cleanup tool output: + +:::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: +The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." +:::image-end::: + +**Dimmed** + +The `#include` cleanup tool indicates unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. + +:::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: +The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. +:::image-end::: + +For the exercise in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. + +There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). + +## See also + +[Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index ffd63b6a96..cccfddf342 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -8,116 +8,100 @@ ms.custom: intro-overview # Clean up C++ #includes in Visual Studio Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: -- Offers to remove unused header files--improving build times. -- Offers to add header files for code that is only working because another header file includes the necessary header file. +- Offers to remove unused header files--improving build times and code cleanliness. +- Offers to add header files for code that is only working because another header file includes the necessary header file, removing dependencies on indirectly included headers. -This article provides an introduction to the `#include` cleanup tool. +The `#include` cleanup tool is on by default. To learn how to configure it, see [Config the C++ #include tool in Visual Studio](include-cleanup-config.md). -## Turn on #include cleanup - -Turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. - -Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: - -:::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: -The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. -:::image-end::: - -The meaning of the suggestion level options are: - -**Refactoring only** - -The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: - -:::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: -When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." -:::image-end::: - -**Suggestion, Warning, Error** - -The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, the `#include` cleanup tool was configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the cleanup tool output: - -:::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: -The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." -:::image-end::: +## Direct vs indirect headers -**Dimmed** +To understand what the include cleanup tool does, here's some terminology: -The `#include` cleanup tool indicates unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. +- A direct header is a header that you explicitly `#include` in your code. +- An indirect header is a header that is included by another header file that you directly include. We also say that the indirect header is a transitively included header file. -:::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: -The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. -:::image-end::: +The include cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. Consider the following header file and the program that uses it: -For the exercise in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. +A header file: -There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). +```cpp +// myHeader.h -## Direct vs indirect headers +#pragma once -To understand what the include cleanup tool can do, here's some terminology: +#include +#include -- Direct headers are headers that you explicitly `#include` in your code. -- Indirect headers are included by another header that you directly include. You can inadvertently take a dependency on the indirect header. +void myFunc() +{ + std::string s = "test()\n"; + std::cout << s; +} +``` -Here's an example of using an indirect header: +And the program that uses it: ```cpp -#include +// myProgram.cpp +#include "myHeader.h" int main() { - int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h + std::string s = "main()"; // string is indirectly included from myHeader.h + std::cout << s; // cout is indirectly included from myHeader.h + test(); } ``` -`CHAR_BIT` is defined in `limits.h`. The reason this code compiles is because `stdlib.h` happens to include `limits.h`. If `stdlib.h` ever stopped including `limits.h`, this code would break because it doesn't directly include a dependency it needs. +In `myProgram.cpp`, `myHeader.h` is a direct header because it is directly included. `myHeader.h` includes `` and ``, so those are indirect headers. The problem here is that `myProgram.cpp` is using `std::string` and `std::cout` but doesn't directly include the headers that define those types. This code happens to compile because `myHeader.h` includes those headers, but this code is brittle because it depends on `myHeader.h` to include those headers. If `myHeader.h` ever stopped including either one of them, this code would break. + +Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). -Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). The C++ include cleanup tool helps you find and fix issues like this. +The C++ include cleanup tool helps you find and fix issues like this. The cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, add missing headers, and so on. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example, what if test() is commented out in `myProgram.cpp`? ```cpp -#include -#include +// myProgram.cpp +#include "myHeader.h" int main() { - int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h - // std::cout << "charSize = " << charSize << std::endl; // Commenting this line means isn't needed + std::string s = "main()"; // string is indirectly included from myHeader.h + std::cout << s; // cout is indirectly included from myHeader.h + // test(); } ``` -In the following screenshot, `#include ` is dimmed because it isn't used since `std::cout` is commented out. Hover your cursor over the dimmed `#include` to bring up the quick action lightbulb. Click the lightbulb (or choose the **Show potential fixes** link) and choose **Remove #include `, which defines `CHAR_BIT`, the code compiles. But we are getting `limits.h` indirectly through `stdlib.h`. The situation we really want is to not include `stdlib.h` because the compiler is just processing extra stuff we don't need, but we do want to include `limits.h` because we are using that. The `#include` cleanup tool can help with this. - -Hover your cursor over the dimmed `#include ` to bring up the quick action lightbulb. Click the lightbulb (or choose the **Show potential fixes** link) and choose **Add all transitively used and remove all unused #includes**: - -:::image type="content" source="media/include-cleanup-add-transitively-used.png" alt-text="Three refactoring options are shown: Remove # include stdlib.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: - -This removes unused headers and adds any used headers that are indirectly included by other header files. In this case, `#include ` is added because `CHAR_BIT` is defined in that header. And `stdlib.h` is removed because we aren't using anything from it. The result is: +We could choose to remove the unused header file, but that results in the code breaking since we will no longer be indirectly including `` and ``. Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the now unused header `myHeader.h`, but also adds any *used* headers that are indirectly included by other header files. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`. You can think of the order of operations with this step as first determining what indirect header files are being included by the unused header file that is about to be removed, they are added, the unused header file is removed, and the result in this case is: ```cpp -#include +// myProgram.cpp +#include +#include int main() { - int charSize = CHAR_BIT; // CHAR_BIT is defined in limits.h - //std::cout << "charSize = " << charSize; + std::string s = "main()"; // string is directly included from + std::cout << s; // cout is directly included from + // test(); } ``` -In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, add headers that were indirectly included by other headers so that now your code follows best practices and is less brittle, and add missing headers. +The tool doesn't update the comments, but you can see that the code is now using `std::string` and `std::cout` directly. This code is no longer brittle because it doesn't depend on `myHeader.h` to include those headers. + +In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, and add headers that were indirectly included by other headers. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. For a practical introduction to improving code quality and build times, see [Cleanup tool walkthrough - TBD naming](link-somewhere).\ -For more information about customizing how the #include cleanup generates suggestions for your project and across your team, see [Cleanup tool configuration reference](link-somewhere). +For more information about customizing how the #include cleanup generates suggestions for your project and across your team, see [Cleanup tool configuration reference](include-cleanup-config.md). ## See also diff --git a/docs/ide/media/include-cleanup-add-transitively-used.png b/docs/ide/media/include-cleanup-add-transitively-used.png deleted file mode 100644 index 8074b6e79d116ffec27f4ba08e29d5bc02db9a79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17622 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
@C~Tvqw^)r?a7;~1vMMSfT3WaqxbW-i>s4qm ze0wM^3)#P`jJcT|(}rOa^tG9Cowt3DNCN_?*Xz;4JGb}SLjI{%XKO95C&Q7EGGa4Q z@oyX)NdOAP`MZB<%HMENez5!GrsYolhakjZWMt&>{=TDwCFif)$JW?)UKl&m_h6lY zFlL@jOj7?S0NXkhb51hq8VCRVyII}(l5>CTr+q0sdE5matPF$18Y157tDN_6T`ElAcK&uv-xf*H75VYm`wzY)<<}G{5 z$X^fwYl$62a(IzA`^l3Yk{%|T6+N>TYT*MDJV?em$;^wx!we9!{w4l+v|z!Vbvb_ z{QSIV&MZivCb1g6H!u(i0ZQlvUTp=9Pucpw@-v_BfMFay)Nwgi-RdI|AYa_Kww6AP zqkWzXL$YI5RJpJNbbzAd6emH36FzX|ZD2s^yyl3xw6w&+!m@dBabYv#2R>5;U?HQuGO>+jnh#?AbX99m3)|e*~z8<1@aXq^qPOPs5f&c*prXX^iQA-?nD6L6?6C_Ij%9 z*SbOv^g-0rvlt+C^U+P6cFN7P$nRvIX75_Bc7~$j6q~AvvUI|nIu1Phiq!GFw?>nd z|4#tl0U-WTsT>Xrc5TdTHg`i19r}`Wr-$>q;i2v46$k_Z!Bxju067aK=fAC$vpXgL z4q;;VjI(Q4U=>96UA6UkJtmW>g*ngeK?hc?tLuVDrAAE--)A0YPShX*Ji1(yKp+qZ zek3{~c%1V(d&jxbi0neeSr91{3Wo{MWHLF-fcCuhk9`iR>w;+T|Kqz%e_mX0H-U4e zuw8x=F;gTE2n0VJ?83zUzuj5EIhK&K5VB)8@2ONO$2^gJ-A1*|O3zt>#0R*~LxJU_jM006X?6%{vZHB@!E z!MzS{@hdN&>FG$5Si0U{{zCu&TCZ#cR0pp@^w_U79w*vfX4-9*b>!DL~(J@ zX(1(9O0PKpKoGA&)E~~3=XFm70MJE2590v<5Q>NK0052Zy{*SL000eOYYqU=s1NzU VfZ^@PaYO(B002ovPDHLkV1gK7Yz+Va diff --git a/docs/ide/media/vs2022-include-cleanup-refactor-options.png b/docs/ide/media/vs2022-include-cleanup-refactor-options.png index 2026dfc867b91b1a3e9547e673296381148aa039..57dfd9200a2503138649a158b936b1e3ae7a7523 100644 GIT binary patch literal 36304 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 gzeH}}3>MQyQ`nvIUqx-@Vi0iXY8l+G(6D>5 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 diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index de7e687c64..d0082dcfde 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -10,6 +10,8 @@ items: href: ../ide/navigate-code-cpp.md - name: Include cleanup tool href: ../ide/include-cleanup-overview.md + - name: Config the C++ #include tool in Visual Studio + href: ../ide/include-cleanup-config.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md - name: Collaborate using Live Share for C++ From b2b8cd5cddf8711ba39b89a5aac0bd5a0b42b2e8 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 3 Oct 2023 15:11:52 -0700 Subject: [PATCH 0178/1931] draft --- docs/ide/include-cleanup-overview.md | 39 ++++++++++++++++------------ docs/ide/toc.yml | 2 +- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index cccfddf342..d87d250046 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -9,32 +9,28 @@ ms.custom: intro-overview Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. -- Offers to add header files for code that is only working because another header file includes the necessary header file, removing dependencies on indirectly included headers. +- Offers to add header files for code that is only working because another header file includes the necessary header file. The `#include` cleanup tool is on by default. To learn how to configure it, see [Config the C++ #include tool in Visual Studio](include-cleanup-config.md). ## Direct vs indirect headers -To understand what the include cleanup tool does, here's some terminology: +Here's some terminology to help you understand what the include cleanup tool does: - A direct header is a header that you explicitly `#include` in your code. -- An indirect header is a header that is included by another header file that you directly include. We also say that the indirect header is a transitively included header file. +- An indirect header is a header that you don't explicitly `#include`, but that is included by a header file that you directly include. We also say that an indirect header is a transitively included header file. -The include cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. Consider the following header file and the program that uses it: - -A header file: +The include cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It also determines which header files aren't used. Consider the following header file and the program that uses it: ```cpp // myHeader.h -#pragma once - #include #include void myFunc() { - std::string s = "test()\n"; + std::string s = "myFunc()\n"; std::cout << s; } ``` @@ -49,19 +45,21 @@ int main() { std::string s = "main()"; // string is indirectly included from myHeader.h std::cout << s; // cout is indirectly included from myHeader.h - test(); + myFunc(); } ``` -In `myProgram.cpp`, `myHeader.h` is a direct header because it is directly included. `myHeader.h` includes `` and ``, so those are indirect headers. The problem here is that `myProgram.cpp` is using `std::string` and `std::cout` but doesn't directly include the headers that define those types. This code happens to compile because `myHeader.h` includes those headers, but this code is brittle because it depends on `myHeader.h` to include those headers. If `myHeader.h` ever stopped including either one of them, this code would break. +In `myProgram.cpp`, `myHeader.h` is a direct header because `myProgram.cpp` directly includes it. `myHeader.h` includes `` and ``, so those are indirect headers. + +The problem is that `myProgram.cpp` is using `std::string` and `std::cout` but doesn't directly include the headers that define those types. This code happens to compile because `myHeader.h` includes those headers. This code is brittle because it depends on `myHeader.h` to include those headers. If `myHeader.h` ever stopped including either one of them, this code would break. Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). -The C++ include cleanup tool helps you find and fix issues like this. The cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, add missing headers, and so on. +The C++ include cleanup tool helps you find and fix issues like this. The cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, and add indirectly included headers directly. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example, what if test() is commented out in `myProgram.cpp`? +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: ```cpp // myProgram.cpp @@ -71,17 +69,24 @@ int main() { std::string s = "main()"; // string is indirectly included from myHeader.h std::cout << s; // cout is indirectly included from myHeader.h - // test(); + // myFunc(); // directly included from myHeader.h } ``` -In the following screenshot, `#include "myHeader.h"` is dimmed because it isn't used since `test()` is commented out. Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the lightbulb (or choose the **Show potential fixes** link) to see actions related to the unused file.: +In the following screenshot, `#include "myHeader.h"` is dimmed (a setting described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md)) because it isn't used since `myFunc()` is commented out. Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the lightbulb (or choose the **Show potential fixes** link) to see actions related to the unused file: :::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: ## Add transitively used headers -We could choose to remove the unused header file, but that results in the code breaking since we will no longer be indirectly including `` and ``. Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the now unused header `myHeader.h`, but also adds any *used* headers that are indirectly included by other header files. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`. You can think of the order of operations with this step as first determining what indirect header files are being included by the unused header file that is about to be removed, they are added, the unused header file is removed, and the result in this case is: +We could choose to remove the unused header file, but that results in the code breaking since we will no longer be indirectly including `` and ``. + +Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the now unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations as: +- first determine which indirect header files are being used and are included by the unused header file that is about to be removed +- add `#include`s for the indirect header files +- remove the unused header file + +The result in this case is: ```cpp // myProgram.cpp @@ -92,7 +97,7 @@ int main() { std::string s = "main()"; // string is directly included from std::cout << s; // cout is directly included from - // test(); + // MyFunc(); } ``` diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index d0082dcfde..15fcf18907 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -10,7 +10,7 @@ items: href: ../ide/navigate-code-cpp.md - name: Include cleanup tool href: ../ide/include-cleanup-overview.md - - name: Config the C++ #include tool in Visual Studio + - name: Config the C++ include tool in Visual Studio href: ../ide/include-cleanup-config.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md From 71fc203066dbe86113f8dff4f5a2cd7ba6846ce1 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 3 Oct 2023 16:30:02 -0700 Subject: [PATCH 0179/1931] draft --- docs/ide/include-cleanup-config.md | 25 ++++++++++++++++++------- docs/ide/include-cleanup-overview.md | 7 ++----- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md index f6db730e39..a175f81b45 100644 --- a/docs/ide/include-cleanup-config.md +++ b/docs/ide/include-cleanup-config.md @@ -1,13 +1,13 @@ --- -title: "Config the C++ #include cleanup tool" -description: "Learn how to configure the C++ include cleanup tool for individual users and for your team." +title: "Config C/C++ #include cleanup in Visual Studio" +description: "Learn how to configure C/C++ include cleanup." ms.date: 10/10/2023 ms.topic: "how-to" ms.custom: intro-overview --- -# Config the C++ #include tool in Visual Studio +# Config C/C++ #include cleanup in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides the `#include` cleanup tool to improve the quality of your code in the following ways: +Starting with Visual Studio 17.7 preview 3, Visual Studio provides the `#include` cleanup tool to improve the quality of your C and C++ code in the following ways: - Offers to remove unused header files--improving build times. - Offers to add header files for code that is only working because another header file includes the necessary header file. @@ -49,10 +49,21 @@ The `#include` cleanup tool indicates unused headers by dimming the line of the The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. :::image-end::: -For the exercise in this article, **Remove unused includes suggestion level** is set to **Dimmed** and **Add missing includes suggestion level** is set to **Suggestion**. +## Configure the include cleanup tool with `.editorconfig` -There are more options for configuring the `#include` cleanup tool such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. For more information, see [Configure code cleanup](/visualstudio/ide/code-cleanup#configure-code-cleanup-JTW_TO_WRITE). +There are more options for configuring the `#include` cleanup tool, such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. These options are defined in an `.editorconfig` file which, among other things, can be added to your project to enforce consistent coding styles for everyone that works in the codebase. For more information about adding an `.editorconfig` file to your project, see [Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options). + +The `.editorconfig` settings that you can use with include cleanup are: + +| Setting | Description | Values | Example | +|--|--|--|--| +| `cpp_include_cleanup_add_missing_error_tag_type` | Sets the error level of add transitive include suggestions. | `none`
`suggestion`
`warning`
`error` | `cpp_include_cleanup_add_missing_error_tag_type = suggestion` | +| `cpp_include_cleanup_remove_unused_error_tag_type` | Sets the error level of remove unused include suggestions. | `none`
`suggestion`
`warning`
`error`
`dimmed` | `cpp_include_cleanup_remove_unused_error_tag_type = dimmed` | +| `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h,vcruntime_string.h` | +| `cpp_include_cleanup_required_files` | Ensures that required files won’t be marked as unused. | indirect header file:filename | `cpp_include_cleanup_required_files = atlwin.h:altbase.h,atlcom.h:altbase.h` | +| `cpp_include_cleanup_replacement_files` | Redirect the usage of the first file to using the second file. | file to replace:replacing file | `cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint` | +| `cpp_include_cleanup_alternate_files` | Prevent #include cleanup from generating suggestions for alternate matches. | file to exclude:alternate file | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h,windows.h:winerror.h` | ## See also -[Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file +[Clean up C and C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index d87d250046..64dc479713 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -5,7 +5,7 @@ ms.date: 10/03/2023 ms.topic: "overview" ms.custom: intro-overview --- -# Clean up C++ #includes in Visual Studio +# Clean up C and C++ #includes in Visual Studio Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. @@ -82,6 +82,7 @@ In the following screenshot, `#include "myHeader.h"` is dimmed (a setting descri We could choose to remove the unused header file, but that results in the code breaking since we will no longer be indirectly including `` and ``. Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the now unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations as: + - first determine which indirect header files are being used and are included by the unused header file that is about to be removed - add `#include`s for the indirect header files - remove the unused header file @@ -105,10 +106,6 @@ The tool doesn't update the comments, but you can see that the code is now using In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, and add headers that were indirectly included by other headers. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. -For a practical introduction to improving code quality and build times, see [Cleanup tool walkthrough - TBD naming](link-somewhere).\ -For more information about customizing how the #include cleanup generates suggestions for your project and across your team, see [Cleanup tool configuration reference](include-cleanup-config.md). - ## See also -[Cleanup tool walkthrough - TBD naming](link-somewhere)\ [Cleanup tool configuration reference](link-somewhere) \ No newline at end of file From 4e7896fb73416686504a88883ace1412e382d58d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Tue, 3 Oct 2023 17:02:06 -0700 Subject: [PATCH 0180/1931] draft --- docs/ide/include-cleanup-config.md | 24 ++++++++++++------------ docs/ide/include-cleanup-overview.md | 16 ++++++++-------- docs/ide/toc.yml | 2 +- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md index a175f81b45..e2afa0d08c 100644 --- a/docs/ide/include-cleanup-config.md +++ b/docs/ide/include-cleanup-config.md @@ -1,21 +1,21 @@ --- -title: "Config C/C++ #include cleanup in Visual Studio" +title: "Configure C/C++ include cleanup in Visual Studio" description: "Learn how to configure C/C++ include cleanup." ms.date: 10/10/2023 ms.topic: "how-to" ms.custom: intro-overview --- -# Config C/C++ #include cleanup in Visual Studio +# Configure C/C++ include cleanup in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides the `#include` cleanup tool to improve the quality of your C and C++ code in the following ways: +Starting with Visual Studio 17.7 preview 3, Visual Studio can cleanup your `#include`s to improve the quality of your C and C++ code in the following ways: - Offers to remove unused header files--improving build times. - Offers to add header files for code that is only working because another header file includes the necessary header file. -This article describes how to configure the `#include` cleanup tool. For more information about the `#include` clean tool, see [Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview). +This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview). -## Turn on #include cleanup +## Turn on include cleanup -The `#include` cleanup tool is on by default. If it isn't active, you can turn on the `#include` cleanup tool via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. +The `#include` cleanup feature is on by default. If it isn't active, you can turn it on via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: @@ -27,7 +27,7 @@ The meaning of the suggestion level options are: **Refactoring only** -The cleanup tool offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: +Include cleanup offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: :::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." @@ -35,7 +35,7 @@ When hovering the cursor over # include iostream, a light bulb appears with the **Suggestion, Warning, Error** -The cleanup tool offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, the `#include` cleanup tool was configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the cleanup tool output: +Include cleanup offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, include cleanup is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the include cleanup output: :::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." @@ -43,15 +43,15 @@ The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC00 **Dimmed** -The `#include` cleanup tool indicates unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. +Include cleanup shows unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. :::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. :::image-end::: -## Configure the include cleanup tool with `.editorconfig` +## Configure include cleanup with `.editorconfig` -There are more options for configuring the `#include` cleanup tool, such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. These options are defined in an `.editorconfig` file which, among other things, can be added to your project to enforce consistent coding styles for everyone that works in the codebase. For more information about adding an `.editorconfig` file to your project, see [Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options). +There are more options for configuring include cleanup such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. These options are defined in an `.editorconfig` file which, among other things, can be added to your project to enforce consistent coding styles for everyone that works in the codebase. For more information about adding an `.editorconfig` file to your project, see [Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options). The `.editorconfig` settings that you can use with include cleanup are: @@ -62,7 +62,7 @@ The `.editorconfig` settings that you can use with include cleanup are: | `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h,vcruntime_string.h` | | `cpp_include_cleanup_required_files` | Ensures that required files won’t be marked as unused. | indirect header file:filename | `cpp_include_cleanup_required_files = atlwin.h:altbase.h,atlcom.h:altbase.h` | | `cpp_include_cleanup_replacement_files` | Redirect the usage of the first file to using the second file. | file to replace:replacing file | `cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint` | -| `cpp_include_cleanup_alternate_files` | Prevent #include cleanup from generating suggestions for alternate matches. | file to exclude:alternate file | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h,windows.h:winerror.h` | +| `cpp_include_cleanup_alternate_files` | Prevent include cleanup from generating suggestions for alternate matches. | file to exclude:alternate file | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h,windows.h:winerror.h` | ## See also diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 64dc479713..b1468743cc 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -7,20 +7,20 @@ ms.custom: intro-overview --- # Clean up C and C++ #includes in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup tool that improves the quality of your code in the following ways: +Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup feature that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. - Offers to add header files for code that is only working because another header file includes the necessary header file. -The `#include` cleanup tool is on by default. To learn how to configure it, see [Config the C++ #include tool in Visual Studio](include-cleanup-config.md). +Include cleanup is on by default. To learn how to configure it, see [Config C/C++ include cleanup in Visual Studio](include-cleanup-config.md). ## Direct vs indirect headers -Here's some terminology to help you understand what the include cleanup tool does: +Here's some terminology to help you understand what include cleanup does: - A direct header is a header that you explicitly `#include` in your code. - An indirect header is a header that you don't explicitly `#include`, but that is included by a header file that you directly include. We also say that an indirect header is a transitively included header file. -The include cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It also determines which header files aren't used. Consider the following header file and the program that uses it: +Include cleanup analyzes your code and determines which headers are directly included and which are indirectly included. It also determines which header files aren't used. Consider the following header file and the program that uses it: ```cpp // myHeader.h @@ -55,11 +55,11 @@ The problem is that `myProgram.cpp` is using `std::string` and `std::cout` but d Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). -The C++ include cleanup tool helps you find and fix issues like this. The cleanup tool analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, and add indirectly included headers directly. +Include cleanup helps you find and fix issues like this. It analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, and add indirectly included headers directly. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. The C++ include cleanup tool helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. Include cleanup helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: ```cpp // myProgram.cpp @@ -104,8 +104,8 @@ int main() The tool doesn't update the comments, but you can see that the code is now using `std::string` and `std::cout` directly. This code is no longer brittle because it doesn't depend on `myHeader.h` to include those headers. -In this brief overview, you've seen how the #include cleanup tool can help you remove unused headers, and add headers that were indirectly included by other headers. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. +In this brief overview, you've seen how include cleanup can help you remove unused headers and add headers that were indirectly included. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. ## See also -[Cleanup tool configuration reference](link-somewhere) \ No newline at end of file +[Config C/C++ include cleanup in Visual Studio](include-cleanup-config.md) \ No newline at end of file diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index 15fcf18907..82094b363b 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -8,7 +8,7 @@ items: href: ../ide/writing-and-refactoring-code-cpp.md - name: Navigate C++ code href: ../ide/navigate-code-cpp.md - - name: Include cleanup tool + - name: Include cleanup overview href: ../ide/include-cleanup-overview.md - name: Config the C++ include tool in Visual Studio href: ../ide/include-cleanup-config.md From 10d4d4568a48f111e754639883bf813ce231e96d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 14:30:14 -0700 Subject: [PATCH 0181/1931] draft --- docs/ide/include-cleanup-config.md | 18 +++++------ docs/ide/include-cleanup-overview.md | 47 +++++++++++++++------------- docs/ide/toc.yml | 2 +- 3 files changed, 33 insertions(+), 34 deletions(-) diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md index e2afa0d08c..3d187e3279 100644 --- a/docs/ide/include-cleanup-config.md +++ b/docs/ide/include-cleanup-config.md @@ -9,15 +9,15 @@ ms.custom: intro-overview Starting with Visual Studio 17.7 preview 3, Visual Studio can cleanup your `#include`s to improve the quality of your C and C++ code in the following ways: - Offers to remove unused header files--improving build times. -- Offers to add header files for code that is only working because another header file includes the necessary header file. +- Offers to add header files for code that is only working because a needed header file is included only indirectly by another header file. -This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [Clean up C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview). +This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [C/C++ include cleanup overview](/visualstudio/ide/include-cleanup-overview). ## Turn on include cleanup -The `#include` cleanup feature is on by default. If it isn't active, you can turn it on via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. +The include cleanup feature is on by default. If it isn't active, you can turn it on via **Tools** > **Options** > **Text Editor** > **C/C++** > **Code Cleanup** and select **Enable #include cleanup**. -Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add missing headers: +Then use the dropdowns to configure how you want to be notified about opportunities to remove unused headers or add indirect headers: :::image type="complex" source="media/vs2022-include-cleanup-option.png" alt-text="The Tools options dialog opened at Text Editor > C/C++ > Code Cleanup."::: The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. @@ -25,17 +25,13 @@ The Enable # include cleanup checkbox is checked. The dropdowns for Remove unuse The meaning of the suggestion level options are: -**Refactoring only** - -Include cleanup offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: +**Refactoring only**: Include cleanup offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: :::image type="complex" source="media/include-cleanup-refactor-lightbulb.png" alt-text="A screenshot of the quick action to remove an unused header"::: When hovering the cursor over # include iostream, a light bulb appears with the text that # include iostream isn't used in this file." :::image-end::: -**Suggestion, Warning, Error** - -Include cleanup offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, include cleanup is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the include cleanup output: +**Suggestion, Warning, Error**: Include cleanup offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, include cleanup is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the include cleanup output: :::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." @@ -66,4 +62,4 @@ The `.editorconfig` settings that you can use with include cleanup are: ## See also -[Clean up C and C++ #includes in Visual Studio](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file +[C/C++ include cleanup overview](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index b1468743cc..b745ed0069 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -1,26 +1,27 @@ --- -title: "Clean up C++ #includes in Visual Studio" -description: "Learn about using the C++ code editor in Visual Studio to remove, add, and transitively add the includes needed in your project." -ms.date: 10/03/2023 +title: "Clean up C/C++ #includes in Visual Studio" +description: "Learn about using C/C++ include cleanup in Visual Studio to remove unused headers, and transitively add indirect headers needed in your project." +ms.date: 10/04/2023 ms.topic: "overview" ms.custom: intro-overview --- -# Clean up C and C++ #includes in Visual Studio +# Clean up C/C++ includes in Visual Studio + +Starting with Visual Studio 17.7 preview 3, Visual Studio provides include cleanup which improves the quality of your code in the following ways: -Starting with Visual Studio 17.7 preview 3, Visual Studio provides an `#include` cleanup feature that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. -- Offers to add header files for code that is only working because another header file includes the necessary header file. +- Offers to add header files for code that is only working because a needed header file is included only indirectly by another header file. Include cleanup is on by default. To learn how to configure it, see [Config C/C++ include cleanup in Visual Studio](include-cleanup-config.md). ## Direct vs indirect headers -Here's some terminology to help you understand what include cleanup does: +First some terminology: - A direct header is a header that you explicitly `#include` in your code. -- An indirect header is a header that you don't explicitly `#include`, but that is included by a header file that you directly include. We also say that an indirect header is a transitively included header file. +- An indirect header is a header that you don't explicitly `#include`, but that is included by a header file that you do directly include. We also say that an indirect header is included `transitively`. -Include cleanup analyzes your code and determines which headers are directly included and which are indirectly included. It also determines which header files aren't used. Consider the following header file and the program that uses it: +Include cleanup analyzes your code and determines which headers are not used and which are indirectly included. Consider the following header file and the program that uses it: ```cpp // myHeader.h @@ -43,23 +44,23 @@ And the program that uses it: int main() { - std::string s = "main()"; // string is indirectly included from myHeader.h - std::cout << s; // cout is indirectly included from myHeader.h + std::string s = "main()"; // string is indirectly included by myHeader.h + std::cout << s; // cout is indirectly included by myHeader.h myFunc(); } ``` -In `myProgram.cpp`, `myHeader.h` is a direct header because `myProgram.cpp` directly includes it. `myHeader.h` includes `` and ``, so those are indirect headers. +`myHeader.h` is a direct header because `myProgram.cpp` explicitly includes it. `myHeader.h` includes `` and ``, so those are indirect headers, as far as `myProgram.cpp` is concerned. -The problem is that `myProgram.cpp` is using `std::string` and `std::cout` but doesn't directly include the headers that define those types. This code happens to compile because `myHeader.h` includes those headers. This code is brittle because it depends on `myHeader.h` to include those headers. If `myHeader.h` ever stopped including either one of them, this code would break. +The issue is that `myProgram.cpp` uses `std::string` and `std::cout`, but doesn't directly include the headers that define those types. This code happens to compile because `myHeader.h` includes those headers. This code is brittle because it depends on `myHeader.h` to include those headers. If `myHeader.h` ever stopped including either one of them, this code would break. Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). -Include cleanup helps you find and fix issues like this. It analyzes your code and determines which headers are directly included and which are indirectly included. It provides feedback, based on the settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers, and add indirectly included headers directly. +Include cleanup helps you find and fix issues like this. It analyzes your code and determines which headers are indirectly included and which aren't used at all. It provides feedback, based on settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers and add indirectly included headers. ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't used. Include cleanup helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't needed. Include cleanup helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: ```cpp // myProgram.cpp @@ -73,21 +74,23 @@ int main() } ``` -In the following screenshot, `#include "myHeader.h"` is dimmed (a setting described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md)) because it isn't used since `myFunc()` is commented out. Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the lightbulb (or choose the **Show potential fixes** link) to see actions related to the unused file: +In the following screenshot, `#include "myHeader.h"` is dimmed (a setting described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md)) because it isn't used since `myFunc()` is commented out. + +Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the lightbulb (or choose the **Show potential fixes** link) to see actions related to the unused file: :::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: ## Add transitively used headers -We could choose to remove the unused header file, but that results in the code breaking since we will no longer be indirectly including `` and ``. +We could choose to remove the unused header file, but that will break the code since we will no longer be indirectly including `` and `` through `myheader.h`. -Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the now unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations as: +Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations followed by include cleanup as: -- first determine which indirect header files are being used and are included by the unused header file that is about to be removed +- determine which indirect header files are being used - add `#include`s for the indirect header files - remove the unused header file -The result in this case is: +The result in this case is to add `#include ` and `#include ` to `myProgram.cpp`, and remove `#include "myHeader.h"`: ```cpp // myProgram.cpp @@ -102,9 +105,9 @@ int main() } ``` -The tool doesn't update the comments, but you can see that the code is now using `std::string` and `std::cout` directly. This code is no longer brittle because it doesn't depend on `myHeader.h` to include those headers. +The tool doesn't update the comments, but you can see that the code is now using `std::string` and `std::cout` directly. This code is no longer brittle because it doesn't depend on `myHeader.h` to include the other required headers. -In this brief overview, you've seen how include cleanup can help you remove unused headers and add headers that were indirectly included. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. +In this brief overview, you've seen how include cleanup can help you remove unused headers, and add headers that were indirectly included. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. ## See also diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index 82094b363b..fd99c7ea86 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -8,7 +8,7 @@ items: href: ../ide/writing-and-refactoring-code-cpp.md - name: Navigate C++ code href: ../ide/navigate-code-cpp.md - - name: Include cleanup overview + - name: C/C++ include cleanup overview href: ../ide/include-cleanup-overview.md - name: Config the C++ include tool in Visual Studio href: ../ide/include-cleanup-config.md From 59b5936f01942b1b59d2a82eb8ad9a0ae41b768d Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 15:02:46 -0700 Subject: [PATCH 0182/1931] draft --- docs/ide/include-cleanup-config.md | 12 ++++++------ docs/ide/include-cleanup-overview.md | 14 +++++++------- docs/ide/toc.yml | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md index 3d187e3279..6509e9f1b5 100644 --- a/docs/ide/include-cleanup-config.md +++ b/docs/ide/include-cleanup-config.md @@ -9,7 +9,7 @@ ms.custom: intro-overview Starting with Visual Studio 17.7 preview 3, Visual Studio can cleanup your `#include`s to improve the quality of your C and C++ code in the following ways: - Offers to remove unused header files--improving build times. -- Offers to add header files for code that is only working because a needed header file is included only indirectly by another header file. +- Offers to add header files for code that is only working because the needed header file is included indirectly. This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [C/C++ include cleanup overview](/visualstudio/ide/include-cleanup-overview). @@ -47,7 +47,7 @@ The line for #include < iostream > is dimmed becasue the line of code that uses ## Configure include cleanup with `.editorconfig` -There are more options for configuring include cleanup such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. These options are defined in an `.editorconfig` file which, among other things, can be added to your project to enforce consistent coding styles for everyone that works in the codebase. For more information about adding an `.editorconfig` file to your project, see [Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options). +There are more options for configuring include cleanup such as excluding specified includes from cleanup suggestions, indicating that some header files are required so that the tool doesn't mark them as unused, and so on. These options are defined in an `.editorconfig` file, that, among other things, can be added to your project to enforce consistent coding styles for everyone that works in the codebase. For more information about adding an `.editorconfig` file to your project, see [Create portable, custom editor settings with EditorConfig](/visualstudio/ide/create-portable-custom-editor-options). The `.editorconfig` settings that you can use with include cleanup are: @@ -55,10 +55,10 @@ The `.editorconfig` settings that you can use with include cleanup are: |--|--|--|--| | `cpp_include_cleanup_add_missing_error_tag_type` | Sets the error level of add transitive include suggestions. | `none`
`suggestion`
`warning`
`error` | `cpp_include_cleanup_add_missing_error_tag_type = suggestion` | | `cpp_include_cleanup_remove_unused_error_tag_type` | Sets the error level of remove unused include suggestions. | `none`
`suggestion`
`warning`
`error`
`dimmed` | `cpp_include_cleanup_remove_unused_error_tag_type = dimmed` | -| `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h,vcruntime_string.h` | -| `cpp_include_cleanup_required_files` | Ensures that required files won’t be marked as unused. | indirect header file:filename | `cpp_include_cleanup_required_files = atlwin.h:altbase.h,atlcom.h:altbase.h` | -| `cpp_include_cleanup_replacement_files` | Redirect the usage of the first file to using the second file. | file to replace:replacing file | `cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint` | -| `cpp_include_cleanup_alternate_files` | Prevent include cleanup from generating suggestions for alternate matches. | file to exclude:alternate file | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h,windows.h:winerror.h` | +| `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. You won’t get a suggestion related to the header at all, whether to add it or that it is unused. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h, vcruntime_string.h` | +| `cpp_include_cleanup_required_files` | Specify that usage of file1 requires file2. For example, specify that if you use `atlwin.h` that `altbase.h` must also be included. | file1:file2 | `cpp_include_cleanup_required_files = atlwin.h:altbase.h, atlcom.h:altbase.h` | +| `cpp_include_cleanup_replacement_files` | Suggest that the usage of file1 be replaced by file2. | file1:file2 | `cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint` | +| `cpp_include_cleanup_alternate_files` | Suggest that file1 be used as an alternative to file2. Useful for facade files. | file1:file2 | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h, windows.h:winerror.h` | ## See also diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index b745ed0069..1a8645aafa 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -7,10 +7,10 @@ ms.custom: intro-overview --- # Clean up C/C++ includes in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides include cleanup which improves the quality of your code in the following ways: +Starting with Visual Studio 17.7 preview 3, Visual Studio provides include cleanup that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. -- Offers to add header files for code that is only working because a needed header file is included only indirectly by another header file. +- Offers to add header files for code that is only working because a needed header file is included indirectly. Include cleanup is on by default. To learn how to configure it, see [Config C/C++ include cleanup in Visual Studio](include-cleanup-config.md). @@ -21,7 +21,7 @@ First some terminology: - A direct header is a header that you explicitly `#include` in your code. - An indirect header is a header that you don't explicitly `#include`, but that is included by a header file that you do directly include. We also say that an indirect header is included `transitively`. -Include cleanup analyzes your code and determines which headers are not used and which are indirectly included. Consider the following header file and the program that uses it: +Include cleanup analyzes your code and determines which headers aren't used and which are indirectly included. Consider the following header file and the program that uses it: ```cpp // myHeader.h @@ -56,7 +56,7 @@ The issue is that `myProgram.cpp` uses `std::string` and `std::cout`, but doesn' Per the C++ guidelines, it's better to explicitly include headers for all your dependencies so that your code isn't subject to brittleness caused by changes to header files. For more information, see [C++ Core Guidelines SF.10](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#sf10-avoid-dependencies-on-implicitly-included-names). -Include cleanup helps you find and fix issues like this. It analyzes your code and determines which headers are indirectly included and which aren't used at all. It provides feedback, based on settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md), such as warnings, suggestions, and so on, so that you can choose to remove unused headers and add indirectly included headers. +Include cleanup helps you find and fix issues like this. It analyzes your code and determines which headers are indirectly included and which aren't used at all. It provides feedback, based on settings described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md). Those settings determine whether suggestions to remove unused headers and add indirectly included headers via warnings, suggestions, and so on. ## Unused headers @@ -76,15 +76,15 @@ int main() In the following screenshot, `#include "myHeader.h"` is dimmed (a setting described in [Config the C++ #include tool in Visual Studio](include-cleanup-config.md)) because it isn't used since `myFunc()` is commented out. -Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the lightbulb (or choose the **Show potential fixes** link) to see actions related to the unused file: +Hover your cursor over the dimmed `#include` to bring up the quick action menu. Click the light bulb (or choose the **Show potential fixes** link) to see actions related to the unused file: :::image type="content" source="media/vs2022-include-cleanup-refactor-options.png" alt-text="Three refactoring options are shown: Remove # include myHeader.h, remove all unused includes, and Add all transitively used and remove all unused # includes."::: ## Add transitively used headers -We could choose to remove the unused header file, but that will break the code since we will no longer be indirectly including `` and `` through `myheader.h`. +We could choose to remove the unused header file, but that breaks the code since `` and `` is not indirectly included via `myheader.h`. -Instead, we can choose **Add all transitvely used and remove all unused #includes**. This removes the unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they are indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations followed by include cleanup as: +Instead, we can choose **Add all transitively used and remove all unused #includes**. This removes the unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they're indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations followed by include cleanup as: - determine which indirect header files are being used - add `#include`s for the indirect header files diff --git a/docs/ide/toc.yml b/docs/ide/toc.yml index fd99c7ea86..859d38c491 100644 --- a/docs/ide/toc.yml +++ b/docs/ide/toc.yml @@ -10,7 +10,7 @@ items: href: ../ide/navigate-code-cpp.md - name: C/C++ include cleanup overview href: ../ide/include-cleanup-overview.md - - name: Config the C++ include tool in Visual Studio + - name: Configure C/C++ include cleanup href: ../ide/include-cleanup-config.md - name: Set your C++ coding preferences href: ../ide/how-to-set-preferences.md From 954cbe2e8ba616c9be749f2a760da67b6e9f0219 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 16:03:52 -0700 Subject: [PATCH 0183/1931] acrolinx --- docs/ide/include-cleanup-config.md | 12 ++++++------ docs/ide/include-cleanup-overview.md | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/ide/include-cleanup-config.md b/docs/ide/include-cleanup-config.md index 6509e9f1b5..7de778de43 100644 --- a/docs/ide/include-cleanup-config.md +++ b/docs/ide/include-cleanup-config.md @@ -11,7 +11,7 @@ Starting with Visual Studio 17.7 preview 3, Visual Studio can cleanup your `#inc - Offers to remove unused header files--improving build times. - Offers to add header files for code that is only working because the needed header file is included indirectly. -This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [C/C++ include cleanup overview](/visualstudio/ide/include-cleanup-overview). +This article describes how to configure include cleanup in Visual Studio. For more information about include cleanup, see [C/C++ include cleanup overview](include-cleanup-overview.md). ## Turn on include cleanup @@ -23,7 +23,7 @@ Then use the dropdowns to configure how you want to be notified about opportunit The Enable # include cleanup checkbox is checked. The dropdowns for Remove unused includes suggestion level, and Add missing includes suggestion level, are shown. The contents of the dropdown are shown, which are: **Refactoring only**, **Suggestion**, **Warning**, and **Error**. The **Remove unused includes suggestion level** dropdown offers the same options but also adds dimmed. :::image-end::: -The meaning of the suggestion level options are: +The meanings of the suggestion level options are: **Refactoring only**: Include cleanup offers actions it can take through the quick action menu when you hover the mouse pointer over an `#include`, or place the cursor on the `#include` line and press Ctrl+period: @@ -34,7 +34,7 @@ When hovering the cursor over # include iostream, a light bulb appears with the **Suggestion, Warning, Error**: Include cleanup offers actions it can take via suggestions, warnings, or errors in the Error List window. You determine which. In the following screenshot of the Error List, include cleanup is configured to show unused headers with a warning. Ensure that **Build + Intellisense** is selected in the dropdown filter so that you can see the include cleanup output: :::image type="complex" source="media/include-cleanup-error-list.png" alt-text="A screenshot of the Error List window."::: -The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > is not used in this file." +The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC002 - #include < iostream > isn't used in this file." :::image-end::: **Dimmed** @@ -42,7 +42,7 @@ The dropdown filter is set to Build + IntelliSense. A warning is visible: VCIC00 Include cleanup shows unused headers by dimming the line of the unused header file in the code editor. Hover your cursor over the dimmed `#include` to bring up the quick action menu and choose **Show potential fixes** to see actions related to the unused file. :::image type="complex" source="media/include-cleanup-dimmed-include.png" alt-text="A screenshot of a dimmed #include < iostream > line."::: -The line for #include < iostream > is dimmed becasue the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > is not used in this file, and has a link to Show potential fixes. +The line for #include < iostream > is dimmed because the line of code that uses iostream is commented out. That line of code is // std::cout << "charSize = " << charSize; The quick action menu is also visible for this line. It says the #include < iostream > isn't used in this file, and has a link to Show potential fixes. :::image-end::: ## Configure include cleanup with `.editorconfig` @@ -55,11 +55,11 @@ The `.editorconfig` settings that you can use with include cleanup are: |--|--|--|--| | `cpp_include_cleanup_add_missing_error_tag_type` | Sets the error level of add transitive include suggestions. | `none`
`suggestion`
`warning`
`error` | `cpp_include_cleanup_add_missing_error_tag_type = suggestion` | | `cpp_include_cleanup_remove_unused_error_tag_type` | Sets the error level of remove unused include suggestions. | `none`
`suggestion`
`warning`
`error`
`dimmed` | `cpp_include_cleanup_remove_unused_error_tag_type = dimmed` | -| `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. You won’t get a suggestion related to the header at all, whether to add it or that it is unused. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h, vcruntime_string.h` | +| `cpp_include_cleanup_excluded_files` | Excludes the specified files from include tool cleanup suggestions. You won’t get a suggestion related to the header at all, whether to add it or that it's unused. | filename | `cpp_include_cleanup_excluded_files = vcruntime.h, vcruntime_string.h` | | `cpp_include_cleanup_required_files` | Specify that usage of file1 requires file2. For example, specify that if you use `atlwin.h` that `altbase.h` must also be included. | file1:file2 | `cpp_include_cleanup_required_files = atlwin.h:altbase.h, atlcom.h:altbase.h` | | `cpp_include_cleanup_replacement_files` | Suggest that the usage of file1 be replaced by file2. | file1:file2 | `cpp_include_cleanup_replacement_files = stdio.h:cstdio,stdint.h:cstdint` | | `cpp_include_cleanup_alternate_files` | Suggest that file1 be used as an alternative to file2. Useful for facade files. | file1:file2 | `cpp_include_cleanup_alternate_files = windows.h:minwindef.h, windows.h:winerror.h` | ## See also -[C/C++ include cleanup overview](/visualstudio/ide/include-cleanup-overview) \ No newline at end of file +[C/C++ include cleanup overview](include-cleanup-overview.md) \ No newline at end of file diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 1a8645aafa..2563dea9f2 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -60,7 +60,7 @@ Include cleanup helps you find and fix issues like this. It analyzes your code a ## Unused headers -As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project, and over time your build time may be impacted by the compiler processing header files that aren't needed. Include cleanup helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: +As your code evolves, you may no longer need some header files. This is hard to keep track of in a complex project. Over time your build time may be slowed by the compiler processing unnecessary header files. Include cleanup helps you find and remove unused headers. For example, what if `myFunc()` is commented out in `myProgram.cpp`: ```cpp // myProgram.cpp @@ -82,7 +82,7 @@ Hover your cursor over the dimmed `#include` to bring up the quick action menu. ## Add transitively used headers -We could choose to remove the unused header file, but that breaks the code since `` and `` is not indirectly included via `myheader.h`. +We could choose to remove the unused header file, but that breaks the code since `` and `` isn't indirectly included via `myheader.h`. Instead, we can choose **Add all transitively used and remove all unused #includes**. This removes the unused header `myHeader.h`, but also adds any headers that are being used that were indirectly included by the removed header file. In this case, `#include ` and `#include ` are added because they're indirectly included by `myHeader.h`, which is then removed. You can think of the order of operations followed by include cleanup as: From 46a5ac22c8ffe4339f52d7b100b86c24b2938b2a Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 16:09:44 -0700 Subject: [PATCH 0184/1931] add a recommended workflow --- docs/ide/include-cleanup-overview.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 2563dea9f2..0a6e257b33 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -107,6 +107,8 @@ int main() The tool doesn't update the comments, but you can see that the code is now using `std::string` and `std::cout` directly. This code is no longer brittle because it doesn't depend on `myHeader.h` to include the other required headers. +If you want a more conservative approach to include cleanup, you can first add direct headers where indirect headers are used, and then go through and remove the unused includes. + In this brief overview, you've seen how include cleanup can help you remove unused headers, and add headers that were indirectly included. This helps you keep your code clean, potentially build faster, and reduces the brittleness of your code. ## See also From c7e6065fdd24e6dcd44e6eb87819cac060e5ec27 Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 16:13:42 -0700 Subject: [PATCH 0185/1931] tech review --- docs/ide/include-cleanup-overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/ide/include-cleanup-overview.md b/docs/ide/include-cleanup-overview.md index 0a6e257b33..5efbc6c839 100644 --- a/docs/ide/include-cleanup-overview.md +++ b/docs/ide/include-cleanup-overview.md @@ -7,10 +7,10 @@ ms.custom: intro-overview --- # Clean up C/C++ includes in Visual Studio -Starting with Visual Studio 17.7 preview 3, Visual Studio provides include cleanup that improves the quality of your code in the following ways: +Starting with Visual Studio 17.8 Preview 1, Visual Studio provides include cleanup that improves the quality of your code in the following ways: - Offers to remove unused header files--improving build times and code cleanliness. -- Offers to add header files for code that is only working because a needed header file is included indirectly. +- Offers to add header files for code that compiles because a needed header file is included indirectly. Include cleanup is on by default. To learn how to configure it, see [Config C/C++ include cleanup in Visual Studio](include-cleanup-config.md). From 92aceaaa1f6ca3c9d2f8734653e88a468b6fd4ae Mon Sep 17 00:00:00 2001 From: TylerMSFT Date: Wed, 4 Oct 2023 16:55:34 -0700 Subject: [PATCH 0186/1931] update alt text and graphics --- ...eating-and-managing-visual-cpp-projects.md | 12 +++--------- ...-visual-cpp-toolset-on-the-command-line.md | 9 +++++---- .../media/x64-native-tools-command-prompt.png | Bin 52814 -> 196127 bytes 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/docs/build/creating-and-managing-visual-cpp-projects.md b/docs/build/creating-and-managing-visual-cpp-projects.md index d8014dfeff..236f7253ed 100644 --- a/docs/build/creating-and-managing-visual-cpp-projects.md +++ b/docs/build/creating-and-managing-visual-cpp-projects.md @@ -1,19 +1,17 @@ --- description: "Learn more about: creating and configuring Visual Studio C++ projects" title: "Visual Studio Projects - C++" -ms.date: 04/20/2022 +ms.date: 10/4/2023 helpviewer_keywords: ["Visual Studio C++ projects, creating", "projects [C++], creating", "Visual Studio C++ projects"] --- # Visual Studio projects - C++ A *Visual Studio project* is a collection of code files and assets such as icons, images, and so on, that are built together using the MSBuild build system. MSBuild is the native build system for Visual Studio and is generally the best build system to use for Windows-specific programs. MSBuild is tightly integrated with Visual Studio, but you can also use it from the command line. - For information about upgrading MSBuild projects from older versions of Visual Studio, see the [Microsoft C++ Porting and Upgrading Guide](../porting/visual-cpp-porting-and-upgrading-guide.md). For cross-platform projects, or projects that use open-source libraries, we recommend using [CMake projects in Visual Studio](cmake-projects-in-visual-studio.md) in Visual Studio 2017 and later. - ## Create a Visual Studio C++ project ::: moniker range=">=msvc-160" @@ -53,13 +51,11 @@ The solution file coordinates build dependencies when you have multiple related Add source code files, icons, or any other items to your project by right-clicking on the project in **Solution Explorer** and choosing **Add > New** or **Add > Existing**. - ## Add third-party libraries to a project Over 900 C++ open source libraries are available via the [vcpkg](https://vcpkg.io/) package manager. Run the Visual Studio integration step to set up the paths to that library when you reference it from any Visual Studio project. - -There are also commercial third-party libraries that you can install. Follow their installation instructions. +They're also commercial third-party libraries that you can install. Follow their installation instructions. ## Set compiler options and build properties @@ -69,11 +65,9 @@ To configure build settings for a project, right-click on the project in **Solut To compile and run the new project, press **F5** or click the *debug dropdown* with the green arrow on the main toolbar. The *configuration dropdown* is where you choose whether to perform a *Debug* or *Release* build (or some other custom configuration). - A new project compiles without errors. When adding your own code, you may occasionally introduce an error or trigger a warning. An error prevents the build from completing; a warning doesn't. All errors and warnings appear both in the Output Window and in the Error List when you build the project. - - ![Screenshot of the Output window and Error list.](../overview/media/vs2017-output-error-list.png) + ![Screenshot of the Output window and Error list, showing a syntax error for a misplaced colon.](../overview/media/vs2017-output-error-list.png) In the **Error List**, you can press **F1** on the highlighted error to go to its documentation topic. diff --git a/docs/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line.md b/docs/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line.md index 1c061847d2..52e00e7ff9 100644 --- a/docs/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line.md +++ b/docs/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line.md @@ -3,7 +3,6 @@ description: "Learn more about: How to: Enable a 64-Bit, x64 hosted MSVC toolset title: "How to: Enable a 64-Bit MSVC Toolset on the Command Line" ms.date: "07/24/2019" helpviewer_keywords: ["x64 [C++]", "64-bit compiler [C++], command line usage", "64-bit compiler [C++], toolset enabling at command line", "command line [C++], 64-bit compiler", "Itanium [C++], command-line compiler", "IPF", "Itanium [C++]", "IPF, command-line compiler", "x64 [C++], command-line compiler"] -ms.assetid: 4da93a19-e20d-4778-902a-5eee9a6a90b5 --- # How to: Enable a 64-Bit, x64 hosted MSVC toolset on the command line @@ -11,11 +10,13 @@ Visual Studio includes C++ compilers, linkers, and other tools that you can use ## Use a 64-bit hosted developer command prompt shortcut -To access these command prompts on Windows, on the **Start** menu, open the folder for your version of Visual Studio, and then choose one of the x64 native or cross-tool developer command prompts. +To access these command prompts on Windows, on the **Start** menu type `x64` and then choose one of the x64 native or cross-tool developer command prompts. -![Windows Start menu showing the x64 Native Tools Command Prompt shortcut.](media/x64-native-tools-command-prompt.png "x64 Native Tools in Start Menu") +:::image type="complex" source="./media/x64-native-tools-command-prompt.png" alt-text="Screenshot showing the start menu with "x64" typed into the search box and the x64 Native Tools Command Prompt shortcut selected."::: +If you have different versions of Visual Studio installed, other versions of the prompt appear. Choose the prompt for the version of Visual Studio that you want to use. +:::image-end::: -To access these command prompts on Windows 8.1, on the **Start** screen, open **All apps**. Under the heading for the installed version of Visual Studio, open the **Visual Studio** folder (in older versions of Visual Studio, it may be named **Visual Studio Tools**). On earlier versions of Windows, choose **Start**, expand **All Programs**, the folder for your version of **Visual Studio** (and on older versions of Visual Studio, **Visual Studio Tools**). For more information, see [Developer command prompt shortcuts](building-on-the-command-line.md#developer_command_prompt_shortcuts). +On earlier versions of Windows, choose **Start**, expand **All Programs**, and then expand the folder for your version of **Visual Studio** (and on older versions of Visual Studio, **Visual Studio Tools**). For more information, see [Developer command prompt shortcuts](building-on-the-command-line.md#developer_command_prompt_shortcuts). ## Use Vcvarsall.bat to set a 64-bit hosted build architecture diff --git a/docs/build/media/x64-native-tools-command-prompt.png b/docs/build/media/x64-native-tools-command-prompt.png index ac088d3aa2cabf97a853f1b11498872405e7951e..ac0c3d4feb733991e3b92b8afa6206e4c51bfa6f 100644 GIT binary patch literal 196127 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