错误和异常程序行为的典型原因是什么只在发布编译模式中表现出来但在调试模式下不会发生?
我有一些F#4.0源代码在Debug中编译良好,但在Release中没有.
没有条件定义,推断类型没有变化,也没有其他我能想到的,这可以解释这个差异给我.
我是否真的偶然发现了编译器错误?
这是一个有问题的代码片段.
let oldItems = userDisplayItems |> Seq.toList
for newItem in newItems do
match List.tryFind (fun (itemOfOld: UserDisplay.UserDisplayItem) -> itemOfOld.Id = newItem.Id) oldItems with
| Some oldItem ->
Run Code Online (Sandbox Code Playgroud)
错误消息指的是最后一次使用"oldItems",在长行末尾的"with"关键字之前.错误消息是:
未定义的值'oldItems:UserDisplayItem list'
什么!?oldItems在上面几行显而易见,这在Debug中编译,为什么不在Release中呢?该错误消息实际上意味着什么?
UserDisplayItem是一个简单的类.newItems是UserDisplayItem的ResizeArray
我查看了构建历史,当UserDisplayItem是F#immutable记录而不是类时,它在Release中编译得很好.
Visual Studio 2015,F#4.0,任何CPU,Release,.NET 4.5.2都是针对性的.
更新:
以下是一个完整的例子.您可以创建一个F#控制台应用程序,并将其粘贴到Program.fs中.我希望它将在Debug中编译,但不会在Release中编译.
open System.Collections.ObjectModel
type User = { Id: int }
[<AllowNullLiteral>]
type UserDisplayItem(id: int) =
let mutable id = id
member x.Id with get() = id and set(v) = id <- v
let userDisplayItems = new ObservableCollection<UserDisplayItem>()
let refreshList …Run Code Online (Sandbox Code Playgroud) 有没有办法知道你的程序是否在C++(甚至C)中有未定义的行为,而不是记住整个规范?
我问的原因是我注意到很多程序在调试中工作但没有发布是由于未定义的行为.如果有一个工具来至少帮助发现UB会很好,所以我们知道存在问题的可能性.
我负责为我正在为之工作的公司开发一个内部企业应用程序.我遇到了一个我无法弄清楚的巨大障碍.
该应用程序使用的音频单元,我有3个iPhone:
3gs - iOS 5.1.1
4 - iOS 5.1.1
5 - iOS 6
Run Code Online (Sandbox Code Playgroud)
使用配置文件我可以在这些设备上运行测试版本,一切正常,使用我自己的开发人员帐户和临时配置文件,它们都可以正常工作.构建它用于企业的无线分发,并且所有iOS 5.1.1设备都不起作用.
没有安装问题,应用程序加载正确但音频单元+我制作的循环缓冲区下地狱.看起来我正在获得大量的缓冲区溢出,但我无法理解为什么,它只能与企业帐户发生这种情况.我得到了所有正确的数据,数据正确地输入到音频中,如果我将循环缓冲区大小增加到非常高,我可以在这里使用正确的音频很短的时间然后它变得朦胧并且会短暂回来并且去再次朦胧
我想知道是否有人知道测试版本和企业版本之间的任何潜在差异.是否有可能有一些我没有遵循的最佳实践,因为我无法理解为什么我看到两者之间存在如此巨大的差异.
注意:只有设置更改我在2个版本之间进行代码签名,没有别的
我最近在工作中发现,由于存在编译器错误的风险,不为硬实时嵌入式系统使用编译器优化的策略是(我们主要使用 gcc,但该策略也扩展到其他编译器)。显然,这项政策的开始是因为过去有人被优化器的错误烧毁了。我的直觉是这过于偏执,所以我已经开始寻找关于这个问题的数据,但问题是我找不到任何关于这个的硬数据。
有谁知道实际获取此类数据的方法?可以使用 gcc bugzilla 页面生成一些错误与编译器优化级别的统计信息吗?甚至有可能获得这样的无偏见数据吗?
我正在尝试检查签名添加是否会溢出.一般来说,检查是否
int a + int b
Run Code Online (Sandbox Code Playgroud)
会溢出(a和b都是正面的),我检查是否
if (a > INT_MAX - b)
Run Code Online (Sandbox Code Playgroud)
但现在我想检查一下
int a + int b - int c
Run Code Online (Sandbox Code Playgroud)
会溢出来的.我知道a,b和c是正数,b> = c,所以我做了以下检查:
if (a > INT_MAX - b + c)
Run Code Online (Sandbox Code Playgroud)
现在我的问题是,编译器可以重写
INT_MAX - b + c to INT_MAX + c - b ?
Run Code Online (Sandbox Code Playgroud)
我担心的是,它会首先执行INT_MAX + c,这可能会溢出并导致未定义的行为.