使用带有Boost C++ 类库的C++ 协同程序

原文发表地址:using C++ Coroutines with Boost C++ Libraries 原文发表时间:2017/5/19 上个月,Jim Springfield 写了一篇关于在Libuv中使用C++ 协同程序的文章(一个用于异步I/O的多平台C类库)。本月我们将介绍如何使用Boost C++ 类库的组件协同工作,即boost::future和boost::asio。 获得Boost 如果你已经安装了boost,你可以跳过这一步。如果还没有安装,建议你使用vcpkg快速地在你的电脑上安装boost。你可以按照如下指令获取vcpkg 然后输入如下命令行安装32位或者64位的boost版本: .\vcpkg install boost boost:x64-windows 为了确保安装正确,请打开VS并且创建一个C++ Win控制台程序: 当你运行程序时,它应该打印出42。 Boost::Future: 协同程序部分 当编译器在处理一个函数中的co_await, co_yield 或者co_return时,它将这个函数视为协同程序。就C++本身来说,它并没有C++协同程序语义的含义,用户或者类库编写者需要提供一个std::experimental::coroutine_traits模板特例化去告诉编译器应该做什么。(编译器通过传递返回值的类型和所有传递给函数的参数的类型)。 我们希望能够编写协同程序以返回boost::future。为了做到这些,我们将按照以下方式特例化coroutine_traits: 当协同程序暂停时,需要返回一个可以满足当协程程序运行到结束或者结束时返回异常的future。 成员函数promise_type::get_return_object解释了怎么获取一个能够连接到特定实例的协同程序的future。成员函数promise_type::set_exception说明了如果在协同程序中发生了未处理的异常时会发生什么。在我们的示例中,我们希望把异常存储在与我们从协同程序中返回的future连接着的promise中。 成员函数promise_type::return_void 说明了当执行到co_return语句或者控制流运行到协同程序末尾的时候会发生什么。 成员函数initial_suspend和final_suspend,正如我们定义的那样,告诉编译器,在它被调用后并且我们要立即开始执行协同程序并且一旦运行完就销毁协同程序。 为了控制非空futures,定义boost::future的特例化任意类型: 注意在这种情况下我们定义了return_value,和前边的例子中的return_void不同。它告诉编译器我们期望一个协同程序最终返回一些非空值(通过一个co_return语句)并且这些值将会被传递到与该协同程序相关联的future。(这两个专门化之间有很多常见的代码;如果需要的话它可以被分离出来)。 现在我们准备好要测试了。在命令行选项增加编译选项“/await”以便启用协同程序在编译器中的支持(因为协同程序还不是C++标准的一部分,所以需要明确的选择性加入去启用它们)。 另外,添加一个支持协同程序的include文件, 这些文件主要定义了std::experimental::coroutine中对我们比较重要的实例化模板: 当程序运行时,它应该打印:“Hi”和42。 Boost::Future: Await部分 下一步是向编译器解释如果你想在boost::future尝试‘await’该怎么做。 给出一个需要await的表达式,编译器需要知道三件事: 准备好了吗? 如果准备好了,怎么获得结果? 如果没有准备好,怎么预定能够当它准备好时得到通知? 为了得到这些问题的答案,编译器会寻找三个成员函数:await_ready能够返回‘true’或者‘false’,当表达式准备好获得结果时编译器将会调用await_resume(调用await_resume的结果会成为整个await表达式的结果),并且最终,编译器会调用await_suspend()函数以便当结果准备就绪时得到通知。并且会传递一个用于恢复或者销毁协同程序的协同程序句柄。 在boost::future的情况下,它有给出答案的功能,但是它没有像上一段描述的那样的必须的成员函数。为了解决这个问题,我们可以定义一个可以把boost::future有的转化为编译器想要的东西的运算符co_await。 在这种情况下,当future准备就绪时,协同程序会通过await_suspend绕过暂停并且立即通过await_resume获得结果。 根据应用,有一种最为有效的方法。比如你正在编写一个客户端应用程序,当future已经准备好了的时候你的程序自然会运行的比较快一点,你免去了暂停之后由boost::future 协同函数所产生的时间消耗。。在服务器应用程序中,随着你的服务器处理数成百个同步请求,当它接收请求时,如果协同程序依据公平准则被启动, 那么处理请求需要的响应时间是可以被预测的, 这将会意义重大。…

0

Microsoft Visual C++ 中的安全功能

Microsoft Visual C++ 中的安全功能 发表时间:2017年6月28日,作者:Andrew Pardoe [MSFT],原文链接:Security Features in Microsoft Visual C++ 每一个开发者都会犯一些错误。无论编写代码时多么小心,您将总是会出现一些错误。并且当运行在连接环境中的软件或者早于其最初计划的寿命使用的软件时,任何错误都可能成为安全漏洞。 不正确的代码是不安全的代码。        Microsoft Visual C++ 工具集提供了大量的可以帮助你写出安全的、正确的代码的功能,在您开始输入代码之前编写安全到你发布代码给用户。        有关MSAVC工具集中特定安全功能的更多信息,请您确保查看 C++的安全最佳实践。   在编写代码之前      在您编写第一行代码,代码安全就开始了。编译器工具集不能显示可能导致安全漏洞的设计缺陷,但打印和在线可以使用许多资源,以帮助您思考潜在漏洞以及如何安全地设计代码。 例如,几乎每个曾经在微软的人都读过Michael Howard和David LeBlanc的“写作安全代码”。 它是非常重要的,在您编写代码时使用现代的C++构建去管理和访问资源。C++可用的资源利用是C++ 核心指南,一套针对C++ 编写的经过验证的准则,规则还有最好的实践。C++核心指南中推荐的编码实践可以帮助您编写出简单的、更现代化的软件。这样做的话,您将避免常见的陷阱,例如整数溢出或者缓冲区溢出,从而使您的代码更加安全。许多C++核心指南可以使用VisualC++附带的静态分析工具执行。 编写代码时    当您编写代码的时候你可以做些什么来帮助你自己呢?首先,通过设置正确的警告级别,从内置的编译器诊断中获取到所有可用的值。在构建代码之后运行代码分析,让编译器工具集深入分析您的代码。并且不要忘记和您的团队定期进行代码审查。 编译器警告 最常用的功能就是编译器警告。MSVC 编译器提供很多开关,允许您控制在代码中看到的警告,以及它们作为信息性消息还是导致您编译失败。 一些编译器警告默认是保持在默认状态,因为它们在您的旧代码中频繁的出现,但大部分被用户都不想看见它们。但是这些警告有许多显示的是您程序中的真实错误。例如,你的代码可能有一个合法的理由比较一个无符号值和一个负数,但它可能是一个错误。通过启用默认值以外的警告,您可以捕获到很多潜在的错误。 要了解有关如何调整构建设置以允许编译器尽可能多地在代码中查找错误的更多信息,您可以参照编译器警告级别选项的文档。 静态代码分析安全功能 我们总是写关于C++ 代码分析的博客,同时我们也让您更新有关CPPCoreCheck扩展的更新,该扩展检查您的代码是否从C++核心准则导出的规则。但是您是否知道,微软长期以来一直将PREfast作为我们的代码分析核心的引擎,一个安全工具? 该工具最初由一个专注于软件卓越的团队开发,后来由Secure Development Lifecycle团队拥有,之后才能使C ++团队进入所有版本的Visual Studio。 我们现在有一些基于PREfast引擎的代码分析工具,包括我们的基础/分析规则,ESPC并发检查器(pdf)和CppCoreCheckers。 我们也在寻找方法来帮助您将代码分析更深入地整合到您的日常开发中。 顾名思义,代码分析对您的代码进行了更深入的分析,以找出可能的错误。 当编译器检测到代码中的许多潜在错误时,代码分析会查看整个函数来确定是否存在可能导致错误的代码路径。 我们称这种分析为“路径敏感”分析。 虽然编译器可以做很多路径敏感的分析,但是有很多情况下它无法识别。 例如,打开(/…

0

6月C++ 综述链接

[原文发表地址] June C++ Link Roundup [原文发表时间] 2017/6/30 在最新一期的CppCast  <chrono> and more with Howard Hinnant,Rob Irving和Jason Turner采访了几期C++11和14专题的作者Howward Hinnant。 PJ Naughter 创建了一种名为Toast++的C++框架,这种框架考虑到桌面Win32应用程序下Windows UWP Notification toasts 的易集成问题。 Mozilla记录和回放框架(“rr”)是一个Linux下记录和回放应用程序(进程和线程树)执行的轻量级工具。你可以设置断点并且反向执行到程序有问题的地方。 ISO C++主办与C++问题有关的的大型C++ FAQ。维基百科将通过会议概述材料持续不断地更新包括大图片问题,类和继承的编码标准,C++11和C++14的相关信息。好的内容受到了初学者和专家的一致好评。 Eric Niebler在五月份举办的西北C++用户群会议上发表了为标准库所做的最新实验添加,以及其背后的概念和设计决策的相关演讲。 Chandler Carruth在六月份举办的西北C++用户群会议上发表了有关C++编译器优化的演讲。 2017微软build大会已于五月在华盛顿州西雅图市举办。你可以获取到我们自己的Marian Luparu所带来的信息正如他在Channel9通过一些演示分享了用VS2017编写C++代码的七大理由和其他内容。 意大利C++会议已于六月举办。已有记录本次会议的英语和意大利语的双语光盘。Raffaele Rialdi发表了有关xcore的演讲,xcore是一种C++ nodejs插件,这种插件允许javascript/nodejs使用.Net Core的组件。过去几年的会议视频已经可以观看。本年度的回忆视频也即将发布。 Jason Turner的著作“微型电脑中的复杂程序:C++17中一个简单的战车64游戏”不容错过。 Punit Jajobia出版了全套系列的C++库函数的相关文章。 C++ Now会议已于五月在科罗拉多州阿斯本市举办。会议视频目前已可以观看。 CppCon会议将于九月入驻华盛顿州贝尔尤维市。提前报名缴费将于七月七日结束。本次活动的通知将稍后在七月份发布。同时我们也提供了会前和会后的培训环节。 CppChat已于七月结束中断。John Kalb对C++做了评论并检查了C++程序员所感兴趣的问题。 如果你有下个月的链接集合,请在评论中分享。谢谢。

0

从Visual Studio中定位Linux的Windows子系统

原文发表地址:https://blogs.msdn.microsoft.com/vcblog/2017/02/08/targeting-windows-subsystem-for-linux-from-visual-studio/ 作者:Marc Goodner 适用于Linux的Windows Subsystem的子系统(WSL)在2016年首次推出,并作为Windows10周年更新中的早期测试版。从此以后,WSL团队一直为此努力工作,大大提高WSL能够运行越来越多的本机Linux命令行二进制文件和工具,包括大多数主流的开发工具,平台和语言,以及很多后台进程\服务*包括MySQL, Apache和SSH。       在Visual Studio 2017中使用”C++ 的Linux开发“的工作负荷,您可以使用Visual Studio的全部功能进行C / C ++ Linux开发。 因为WSL只是另一个Linux系统,您可以按照我们的使用Linux工作负荷指南,从Visual Studio中进行定位。 这为您提供了大量的灵活性,使您的开发机器上的整个开发周期保持在本地,而不需要单独的VM或机器的复杂性。 然而,值得介绍如何在Bash / WSL上更详细地配置SSH。 安装WSL       如果你还没有这样做,你首先需要启用开发人员模式并安装WSL本身。 这只需要几秒钟,但需要重新启动。    当您第一次运行Bash时,您需要按照屏幕上的说明接受Canonical的许可证,下载Ubuntu映像,并将其安装在您的计算机上。 然后,您需要选择UNIX用户名和密码。 这不需要与您的Windows登录用户名和密码相同,如果你喜欢。 您将只需要在以后使用sudo执行命令或者“远程”登录时输入UNIX用户名和密码(如下:)。       现在你将在你的机器上有一个vanilla Ubuntu实例,您可以在其中运行任何ELF-64 Linux二进制文件,包括使用apt-get下载的二进制文件! 在我们继续之前,让我们安装build-essential包,以便你有一些关键的开发工具,包括GNU C ++编译器,链接器等: $ sudo apt install -y build-essential 安装&配置SSH 让我们使用’apt’软件包管理器在Bash / WSL上下载和安装SSH: $ sudo apt install -y openssh-server     …

0

Visual Studio 2017 RTM中的C++代码分析改进

发表时间:2017.3.7 作者:Sunny Chatterjee 原文发表地址: https://blogs.msdn.microsoft.com/vcblog/2017/03/07/c-code-analysis-improvements-in-visual-studio-2017-rtm/ Visual Studio 2017 RTM发布的版本包含核心指南检查器作为C/C++代码分析工具的一部分。我们通过我们的外部客户对这些检查的早期预览获得了大量有用的反馈。感谢您与我们的合作,并给予我们很大的反馈。这个反馈帮助我们提高了最终发布的C++核心指南检查的质量。其中有关const正确性的改进在这篇博客中有详细的解释。 除了发布C++核心指南检查器,我们还在我们的核心分析引擎中修复了超过150个错误。所有这些修复程序都可在Visual Studio2017 RTM中使用。今天就下载使用Visual Studio 2017,让我们知道你对代码分析改进的看法! 这里有一些值得注意的修复,因为它经常出现。这些修复将作为直接外部反馈的结果。 在取消引用空指针检查期间出现误报(C6011) https://connect.microsoft.com/VisualStudio/feedback/details/1645136/c6011-occurs-const-cast-to-const-members-after-if-statement https://connect.microsoft.com/VisualStudio/feedback/details/3113987/error-msb4018-the-mergenativecodeanalysis-task-failed-unexpectedly http://connect.microsoft.com/VisualStudio/feedback/details/2556936/static-analysis-c6011-warning-false-positive-in-short-circuited-conditionals https://connect.microsoft.com/VisualStudio/feedback/details/2750342/static-analysis-false-positive-when-using-a-bracketed-ternary-operator https://connect.microsoft.com/VisualStudio/feedback/details/3078125/false-positive-dereferencing-null-pointer-warning-when-taking-a-named-reference https://connect.microsoft.com/VisualStudio/feedback/details/3082362/static-analysis-false-positive-when-comparing-ptr-nullptr-vs-simply-ptr 在未初始化记忆检查时出现误报(C6011) http://connect.microsoft.com/VisualStudio/feedback/details/1858404/false-positive-in-c-static-analysis-c6001 https://connect.microsoft.com/VisualStudio/feedback/details/2607792/erroneous-report-from-sal 关于不一致注解检查出现的误报(C28252和C28253) http://connect.microsoft.com/VisualStudio/feedback/details/2053524/wsutil-compiler-version-1-0095-creates-a-file-that-triggers-warnings-c28252-and-c28253-even-when-compiled-with-w0 在注解解析时出现误报(C28285) http://connect.microsoft.com/VisualStudio/feedback/details/2358718/sal-analysis-warning-c28285-when-using-local-static-variables 在严格类型匹配检查出现误报(C28039) https://connect.microsoft.com/VisualStudio/feedback/details/2573764/sal-false-positive-on-strict-type-match 在本地vs下检查枚举类,对全局声明时出现误报(C6244) https://connect.microsoft.com/VisualStudio/feedback/details/3101212/incorrect-static-analysis-warning-of-enum-class-enumerators-hiding-other-declarations 代码分析运行期间MSBuild错误MSB4018:”MergeNativeCodeAnalysis”任务意外失败 https://connect.microsoft.com/VisualStudio/feedback/details/3113987/error-msb4018-the-mergenativecodeanalysis-task-failed-unexpectedly 给我们您的回馈! 我们希望Visual Studio 2017中的C ++代码分析工具可以帮助您改进代码并提高效率。 我们非常感谢大家,一如既往,我们欢迎您的反馈。 请告诉我们您对我们目前的工具集的喜好和不满,以及您将来发布的内容。 对于问题,请通过“安装程序”或“Visual Studio IDE”本身的“报告问题”选项来了解问题。 您也可以通过电子邮件cppcorecheck@microsoft.com与我们联系。

0

将您的C++代码带到Visual Studio中

[原文发表地址] Bring your C++ code to Visual Studio [原文作者] Marian Luparu[MSFT] [原文发表时间] 2017/4/14 C ++已经存在了很长时间,并且在整个历史上,已经建立了许多工具来使C ++开发人员更轻松. 这导致了多种C ++生态系统的编辑工具,构建系统,编程风格和我们在日常工作中使用的C ++库。作为C ++开发人员,您可能习惯于为不同目的使用来自不同供应商的各种工具。请放心,一旦开始使用Visual Studio,您将不需要在开发C++项目时去额外的改变开发工具。Visual Studio为任何您的任何目标平台的C ++开发工作提供行业领先的开发工具. 根据您的C ++项目的几个特点,本文档将引导您完成使用Visual Studio的推荐步骤。阅读每章,看看它是否符合您的项目描述。这篇文章是针对Visual Studio新用户的C ++入门系列的一部分。 跨平台C ++应用程序和库 使用Cmake工具编译 如果您的项目针对多个平台,你很可能使用CMake工具来生成项目。在这种情况下,移动到Visual Studio所需的步骤非常简单 -只需打开包含您的CMakeLists.txt文件的文件夹,并让Visual Studio执行其余操作。要了解有关在Visual Studio中使用CMake的更多信息,请参阅Visual Studio对CMake的支持 这篇文章。 基于Qt 框架的开发或者使用QMake工具的编译 Qt框架是一个跨平台的C ++框架;它是构建桌面,移动甚至嵌入式解决方案的理想选择。虽然您可以使用CMake来编译基于Qt的工程(在这种情况下,您应该查看上一个主题),Qt还提供了自己的Qt优化的生成系统,称为qmake,它也支持非Qt C ++项目。如果您使用的是qmake,请学习如何将.pro项目导入到Visual Studio中。 搭建一个跨平台的C ++构建系统(make,ninja,gyp,scons,gradle等) 有许多构建系统支持C ++的跨平台场景。推荐其中一个工具已经超出本文档的范围了。但是无论您的项目目前使用的是哪个构建系统,您都可以在Visual Studio中打开它,并且只需极少的配置就可以实现高效。你不仅可以在VS中使用任何这些构建系统,您可以启用以下所有或任何下面这些Visual Studio功能: C ++编辑(例如IntelliSense,代码导航) 构建 C…

0

Visual Studio中的C++代码编辑和导航

原文发地址:https://blogs.msdn.microsoft.com/vcblog/2017/04/20/c-code-editing-and-navigation-in-visual-studio/ 作者:Augustin Popa Visual Studio提供了一套有效的工具,使C++开发人员可以轻松的阅读,编辑和浏览代码。在这篇博文中,我们将深入了解这些功能。并介绍他们的工作。这篇文章是针对Visual Studio的新用户。 这篇文章涉及以下的概念: 阅读和理解代码 基础的编辑器功能 快速信息和参数信息 滚动条地图模式 类视图 生成包含文件的图形 查看调用层次结构 速览定义 2.  浏览你的代码库 打开文档 切换头文件/代码文件 解决方案资源管理器 转到定义/声明 查找/在文件中查找 查找所有引用 导航栏 转到 快速启动 3. 编辑和重构代码 基本编辑功能 更改跟踪 智能提示 快速修改 重构功能 使用EditorConfig执行代码样式 4. 键盘快捷键参考 5. 结论 阅读和理解代码 如果你像大多数开发人员一样,你可能花更多的时间来查看代码而不是修改代码。考虑到这一点,Visual Studio提供了一套功能来帮助您更好地可视化和了解您的项目工程。 基本编辑功能 Visual Studio 自动为您的代码提供语法着色,以区分不同类型的符号。未使用的代码(例如#if 0下的代码)的颜色更加褪色。此外,代码区添加轮廓线,使其易于展开或者折叠。 如果你的代码中有错误,这将导致编译失败,Visual Studio会在问题发生添加红色的波浪线。如果Visual Studio发现您的代码有问题,但这个问题不会导致编译失败。您将看见一个绿色波浪线。您可以在“错误列表”窗口中查看到任何编译器生成的警告或者错误。 如果将光标放在大括号上,“{“或”}”,则Visual Studio会突出显示其匹配的 您可以通过按住Ctrl键和滚动鼠标滚轮或选择左下角的缩放设置,在编辑器重放大或缩小。 “工具”>“选项”菜单是Visual Studio选项的中心位置,可让您配置各种不同的功能。 值得探索的是根据您的独特需求量身定做IDE。…

0