変更ログ 2.075.0
Download D 2.075.0
2017年7月19日リリース
コンパイラの変更
ランタイムの変更
ライブラリの変更
D 2.075.0におけるすべてのバグ修正と機能強化のリスト。
コンパイラの変更
- 追加 __traits(getParameterStorageClasses, f, i)
ref int foo(return ref const int* p, scope int* a, out int b, lazy int c); pragma(msg, __traits(getParameterStorageClasses, foo, 0)); static assert(__traits(getParameterStorageClasses, foo, 0)[0] == "return"); static assert(__traits(getParameterStorageClasses, foo, 0)[1] == "ref"); pragma(msg, __traits(getParameterStorageClasses, foo, 1)); static assert(__traits(getParameterStorageClasses, foo, 1)[0] == "scope"); static assert(__traits(getParameterStorageClasses, foo, 2)[0] == "out"); static assert(__traits(getParameterStorageClasses, typeof(&foo), 3)[0] == "lazy");
- 異なる列挙型に属する値の比較は非推奨である。
この変更は匿名列挙には影響しない。
enum Status { good, bad } enum OtherStatus { ok no, } // 非推奨 - goodとokはどちらも0と評価されるが、 // これらは異なる列挙型に属する static assert(Status.good == OtherStatus.ok);
- 非推奨の組み込み配列プロパティ.sort と.reverse は削除された。
これらの組み込み配列プロパティの使用は2.072.0から非推奨となり、現在は削除されている。 使用する std.algorithm.sorting.sortと std.algorithm.mutation.reverseを使う。
- セミコロンによる空文を非推奨とする。
セミコロンを使った空文の作成は、以前は警告が出されていたが、現在は非推奨となっている。 以前は警告が発せられていたが、現在は非推奨のヒントが発せられている。 ヒント
- traits(getFunctionVariadicStyle,f)を追加する。
import core.stdc.stdarg; void novar() {} extern(C) void cstyle(int, ...) {} extern(C++) void cppstyle(int, ...) {} void dstyle(...) {} void typesafe(int[]...) {} static assert(__traits(getFunctionVariadicStyle, novar) == "none"); static assert(__traits(getFunctionVariadicStyle, cstyle) == "stdarg"); static assert(__traits(getFunctionVariadicStyle, cppstyle) == "stdarg"); static assert(__traits(getFunctionVariadicStyle, dstyle) == "argptr"); static assert(__traits(getFunctionVariadicStyle, typesafe) == "typesafe"); static assert(__traits(getFunctionVariadicStyle, (int[] a...) {}) == "typesafe"); static assert(__traits(getFunctionVariadicStyle, typeof(cstyle)) == "stdarg");
ランタイムの変更
- Windows:DATAセグメントとTLSセグメントを正確にスキャンするように設定できるようになった。
新しいランタイムオプション "scanDataSeg"が追加された。 DATAセグメントとTLSセグメントを正確にスキャンできるようになった。これは、コンパイラが生成する情報を使用して、これらのセグメント内の可能性のあるポインタを特定する。 セグメント内のポインターを特定する。使用可能なオプション値は以下のとおりである。 "conservative"(デフォルト)と"precision"である。
いつものように、このオプションは、環境、コマンドライン、または実行ファイルにオプションを埋め込むことによって設定することができる。 GCオプションと同じように、オプションを実行ファイルに埋め込むことによっても設定できる。 GCオプションと同様に、実行ファイルにオプションを埋め込むことで設定できる。
例えば、以下のコードをメインモジュールに追加し、正確なスキャンを可能にする:
extern(C) __gshared string[] rt_options = [ "scanDataSeg=precise" ];
- ファイバー・スタックのプロテクション・ページ・サイズを設定可能にする
新しいファイバーのコンストラクタの引数であるguard_page_sizeを使って、ガード・ページ・サイズを変更できるようになった。 で変更できるようになった。デフォルトは PAGE_SIZE (Windowsで使われていたものと同じ)であり、0を指定するとこの機能はオフになる。 を指定するとこの機能はオフになる。
- Posix用のFiberのスタック保護ページを追加した。
Windowsのファイバー実装にすでにある機能が、Posix用に追加された。 に追加された:ファイバーのスタックに使用される最後の ファイバーのスタックに使われる最後のページの後(または前)に、あらゆるアクセスから保護されたページが割り当てられる。 を確保する。これにより、ファイバーのスタックがオーバーフローすると、システムは即座にトラップする。 スタックのオーバーフローを引き起こす。
- TypeInfo.init は"@pro型"プロパティを指すようになった。
TypeInfo.init と呼ばれるようになった。 TypeInfo.initializer.名前の変更は必要だった。 init "という名前は、同じ名前の"@property"(init)という型プロパティと衝突してしまうからである。 (init)と衝突してしまうためである。TypeInfo.init 、"@property"は型プロパティを指すようになった。
ライブラリの変更
- hasLength length が"型"であることを強制するようになった。size_t
歴史的に、hasLength!R は、true を返す。 R.length がulong に変換可能な他の型、例えばint,ushort を返す、 const(size_t)また、alias this を使用したユーザー定義型や、特に32ビット・システム上のulong のような、 に変換可能な他の型を返していた。 32ビットシステムでは特にそうである。この動作は廃止された。2017年12月以降 std.range.primitives.hasLengthがtrue を生成する場合のみである。R.length が正確な型size_t を返す場合のみ、 を返す。
- std.datetimeはパッケージに分割された。
std.datetimeは以下のモジュールを含むパッケージになった:
- std.datetime.date
- std.datetime.interval
- std.datetime.stopwatch
- std.datetime.systime
- std.datetime.timezone
この std.datetimeパッケージはこれらのモジュールすべてを公にインポートしている。だから のすべてがインポートされるため、既存のコードが壊れることはない。 std.datetimeをインポートすることで、std.datetimeのすべてがインポートされる。新しいコードは 新しいコードは、モジュールを個別にインポートするか、パッケージ全体をインポートするかを選択できる。
std.datetime.dateDate、TimeOfDay、DateTime、および関連する 関数を含む。DateTimeExceptionも含まれる。
std.datetime.intervalInterval型と*IntervalRange型を含む。 型と関連する自由関数が含まれている。
std.datetime.systimeはSysTimeと関連するフリー関数を含む。
std.datetime.timezoneタイムゾーンの型が含まれている。
パッケージには std.datetimeパッケージにはStopWatchとベンチマーク関数が含まれている。 (が含まれている(そのため、これらはstd.datetime 経由でのみインポート可能で、サブモジュール経由ではインポートできない)。これらの関数は これらの関数は core.time.TickDuration(に置き換えられている)。 core.time.MonoTimeに置き換えられているので、非推奨)。
std.datetime.stopwatchが追加された。これには StopWatchとbenchmarkのバージョンが含まれており、これらは既存のシンボルとほぼ同じAPIを持っている、 しかし、これらは core.time.MonoTimeと core.time.Durationの代わりに core.time.TickDuration.次のメジャー・リリースでは、std.datetime.packageの古い関数は廃止される。 の古い関数は非推奨となるため、古い ベンチマーク関数を使用するコードは、std.datetime.stopwatchを使用するように更新する必要がある。
しかし、新バージョンと旧バージョンの間で両立しないシンボルの衝突を避けるため、std.datetime.stopwatchは一般にインポートされないことに注意してほしい。 std.datetime.stopwatchは、古いシンボルが削除されるまで、std.datetime.packageから一般にインポートされない。 されないことに注意されたい。そのため を使用するコードは、当分の間 std.datetime.stopwatch.StopWatchまたは std.datetime.stopwatch.benchmarkを使用するコードは、直接 を直接インポートする必要がある。std.datetime と std.datetime.stopwatchの両方をインポートするコードは、選択的インポートを使用するか、完全修飾シンボルを使用してシンボルの競合を調整する必要がある。 を使用する必要がある。 しかし、std.datetime.stopwatchをインポートするように更新されるまでは、どのコードもこの変更の影響を受けない、 最終的に古いシンボルが削除されると、選択的インポートと新しいシンボルへの完全修飾パスが使用される。 新しいシンボルへの完全修飾パスは機能し続け、壊れることはない。 (その時点では、std.datetime.packageをインポートするだけでも動作する。 std.datetime.packageは公的にインポートするように更新されている。 std.datetime.stopwatchを公にインポートするように更新されているからだ)。std.datetime.stopwatchをインポートせずに、単にstd.datetime.stopwatchをインポートするコードは動作する。 std.datetimeをインポートせずにstd.datetime.stopwatchをインポートするだけのコードでは、シンボルの衝突を心配する必要はない。
- std.string 、いくつかの関数が非推奨となった。
関数は廃止された。 std.string.inPattern, std.string.countchars, std.string.removechars, std.string.squeezeおよび std.string.munchはすべて非推奨となった。これらの関数は廃止された。 の関数でカバーできるようになったため、廃止された。 std.regexおよび std.algorithm.から削除される。 std.string2018年5月に
まだこれらを使用する必要がある場合は、undaDを参照のこと。
以下は、非推奨の関数とその現代的な置き換えの例である。
使用する std.algorithm.searching.findで置き換える std.string.munch:
import std.algorithm; import std.ascii; import std.string; import std.utf; string s = "\tabc"; // 古い s.munch(whitespace); // 新しい s = s.find!(a => !isWhite(a));
使用する std.regex.matchFirstで置き換える std.string.inPattern:
import std.string; import std.regex; // 古い if (inPattern('x', "a-z")) { ... } // 新しい if ("x".matchFirst(regex("[a-z]"))) { ... }
使用する std.regex.replaceAllで置き換える std.string.removechars:
import std.string; import std.regex; // 古い "abc".removechars("a-z"); // 新しい "abc".replaceAll(regex("[a-z]"), "");
使用する std.algorithm.iteration.uniqで置き換える std.string.squeeze:
import std.algorithm; import std.string; // 古い "hello".squeeze; // 新しい "hello".uniq;
- 暗号ハッシュの定数時間比較関数を追加した。
に新しい関数を追加した。 std.digest.digest.secureEqualに新しい関数を追加した。 を追加した。この比較は タイミング攻撃から保護するために、2つの範囲が等しいかどうかに関係なく、比較は一定時間で行われる。 タイミング攻撃から保護するためである。この攻撃の詳細については のドキュメントを参照されたい。 std.digest.digest.secureEqual.
import std.digest.digest : secureEqual, toHexString; import std.digest.hmac : hmac; import std.digest.sha : SHA1; import std.string : representation; void main() { // 典型的なHMACデータの完全性検証 auto secret = "A7GZIP6TAQA6OHM7KZ42KB9303CEY0MOV5DD6NTV".representation; auto data = "data".representation; string hex1 = data.hmac!SHA1(secret).toHexString; string hex2 = data.hmac!SHA1(secret).toHexString; string hex3 = "data1".representation.hmac!SHA1(secret).toHexString; assert( secureEqual(hex1, hex2)); assert(!secureEqual(hex1, hex3)); }
- 64ビットCRCのサポートを追加
ISOとECMAの64ビットCRCの両方をサポートするようになった。 std.digest.crc.
import std.digest.crc; void main() { ubyte[8] hash64ecma = crc64ECMAOf("abc"); assert(crcHexString(hash64ecma) == "2CD8094A1A277627"); ubyte[8] hash64iso = crc64ISOOf("abc"); assert(crcHexString(hash64iso) == "3776C42000000000"); }
D 2.075.0におけるすべてのバグ修正と機能強化のリスト:
DMDコンパイラのリグレッション
- Bugzilla 16408: [REG2.065] 関数引数の評価順序が左から右に一貫していない。
- Bugzilla 17275: [reg 2.072.0] AssertError@declaration.d(2121):アサーション失敗
- Bugzilla 17293: "DからC++クラスを使用する"例が機能しなくなった。
- Bugzilla 17338: [Reg 2.075] リンクの失敗 サポートされていないシンボルセクション 0xff01
- Bugzilla 17352: [REG 2.075a] 内部エラー: ddmd/backend/elfobj.c 1739 on duplicate definition
- Bugzilla 17356: [Reg 2.075] __simd_sto が実行されなくなった。
- Bugzilla 17399: [REG2.071] core.checkedint.adduは関数をインライン化できない。
- Bugzilla 17451: ddmd/declaration.d(2179) の ICE
- Bugzilla 17481: [REG 2.069.0] "synchronized":win32 の dmd -O でアクセス違反が発生した。
- Bugzilla 17492: [REG 2.066] [Ice] AssertError@ddmd/dclass.d(1007):アサーション失敗
- Bugzilla 17502: [REG2.064] クラスメソッド内の契約違反がdmdのセグメンテーションフォールトを引き起こす。
- Bugzilla 17505: [REG2.075] "@safe" コンストラクタはデコンストラクタも安全である必要がある。
- Bugzilla 17506: [REG2.075]@disableコンストラクタはメンバを初期化する必要がある。
- Bugzilla 17545: [REG2.072] __traits(getAttributes, name)は、名前を早期に "値"に評価する。
- Bugzilla 17548: [REG2.072.0] スコープ関数のパラメータで前方参照エラーが発生する。
- Bugzilla 17614: [REG2.075.0-b2] __VERSION__の値が正しくない。
DMDコンパイラのバグ
- Bugzilla 7016: ローカルインポートで -deps 依存関係が作成されない。
- Bugzilla 13331: -profileでコンパイルするとasm関数が壊れてしまう。
- Bugzilla 15896: インポートバインディングを使用するとprivateが無視される。
- Bugzilla 15945: sizeof が無効な型でもコンパイルできるようだ。
- Bugzilla 16244: メソッドargの型がcomplextypeof() 、コンパイラがICEする。
- Bugzilla 16566: hasLengthは長さがsize_t型であることを強制すべきである。
- Bugzilla 17289: Xcode 8.3 のリンカーで "pointer not aligned" の警告が表示される。
- Bugzilla 17317: 2.074.0のリリース候補はバックエンドライセンスが更新されていない
- Bugzilla 17335: コンパイル中に評価されるとき、接続中の"関数"呼び出しがショートしない。
- Bugzilla 17337: AVXベクトル初期化のSIGILL
- Bugzilla 17339: const alias引数で曖昧なマングリングが発生する。
- Bugzilla 17344: inc/decrement後の積分ベクトルの代入でのICE
- Bugzilla 17349: 共変数のオーバーライドを許可する
- Bugzilla 17367: CodeView/MSCOFF: 列挙子に対する不正なデバッグ情報
- Bugzilla 17391: セキュリティ:DDOCコメントによるXSS
- Bugzilla 17422: [スコープ] クラス参照がスコープ変数として初期化されていない
- Bugzilla 17432: [DIP1000] スコープのデリゲートは型を変更するが、マングリングは行わない
- Bugzilla 17450: デリゲートのコンテキストポインタのエスケープがメンバ関数で検出されない。
- Bugzilla 17468: CTFE中に内部アサーションが失敗する
- Bugzilla 17491: 無効でコンパイルされる: *s.init.varがl値でない。
- Bugzilla 17495: __traits(getParameterStorageClasses)は、タプルをパラメータとして使用すると動作しない
DMDコンパイラの機能強化
- Bugzilla 6227: 異なる列挙型の比較
- Bugzilla 16197: 配列の初期化でコンストラクタ/ポストビットとデストラクタが一致しない
- Bugzilla 16540: 遅延パラメータで属性が正しく伝搬されない
- Bugzilla 16600: 変更可能なコンストラクタと変更可能なコンストラクタが曖昧な場合のエラーメッセージが正しくない。
- Bugzilla 17396: dmdのエラーメッセージに色付きのシンタックスハイライトを追加した。
- Bugzilla 17419: シンボルsのリンケージに__traits(getLinkage, s)を追加した。
- Bugzilla 17425: __traits(getParameterStorageClasses, f, i)を追加した。
- Bugzilla 17429: [スコープ]各スコープのクラス参照は、別の削除コールを追加する
- Bugzilla 17457: 名前付き戻り値の最適化(NRVO)はコンストラクタ呼び出しの戻り値では行われない
- Bugzilla 17494: エラー例外がスローされた場合、scope(...)を実行しない。
phobosのリグレッション
- Bugzilla 17452: std.container.arrayの未定義参照
- Bugzilla 17472: [Reg 2.075] typeof(stdin)はもはやFileではない
- Bugzilla 17482: [REG 2.074] コンパイルエラー:Nullable!Variantと基本型を比較する
- Bugzilla 17511: [REG 2.075a] std.xmlが孫をアイテムに入れる
- Bugzilla 17555: [REG2.070.0] JSONデータ内の制御文字は無効であり、例外を発生させるべきである。
- Bugzilla 17650: [REG v2.075.0 b1-b4] std.getoptの範囲違反
phobosのバグ
- Bugzilla 5904: std.json parseStringがBMP外の文字を処理しない
- Bugzilla 15517: std.experimental.logger: 'sharedLog'を使用してデフォルトのロガーのファイルロギングに変更することができない。
- Bugzilla 15534: [std.experimental.logger.core]ドキュメントの不一致
- Bugzilla 15720: iota(long.max, long.min, step) が正しく動作しない。
- Bugzilla 15763: std.math.approxEqualが対称ではない
- Bugzilla 16246: iota を 3 [u]bytes または 3 [u]shorts で呼び出せない。
- Bugzilla 16256: std.experimental.loggerがdstringを正しくログできない
- Bugzilla 16326: フィルタの遅延が不十分で、保存時の挙動がおかしい。
- Bugzilla 17251: Appender.putがconst input range elementsでエラーになる。
- Bugzilla 17270: std.experimental.Final がポインタで失敗する
- Bugzilla 17283: std.experimental.typeconsがプライベートモジュールのメンバを使う
- Bugzilla 17288: width/precisionが指定されformattedWriteエラーが発生する。
- Bugzilla 17314: BinaryHeapは長さ1の配列でヒープ化すると挿入時にクラッシュする。
- Bugzilla 17328: std.experimental.logger: ゼロの16進数フォーマットが間違っている
- Bugzilla 17519: RedBlackTreeはconst/immutable要素を好まない。
- Bugzilla 17553: std.jsonはJSONエンコード時にUTFデコードを行うべきではない。
- Bugzilla 17556: std.jsonはJSONOptions.escapeNonAsciiCharsで非BMP文字を正しくエンコードしない。
- Bugzilla 17564: std.experimental.allocator.theAllocatorが共有static this内でnullである。
phobos が強化された
- Bugzilla 6621: std.range.chunksの重畳量。
- Bugzilla 7102: std.numeric.gcdをBigIntsでも使えるようにした。
- Bugzilla 10001: アンダースコアを使った文字列フォーマット
- Bugzilla 16108: postblitが無効な構造体ではto!string 。
- Bugzilla 16615: std.processに子プロセスの機能がない。
- Bugzilla 17286: つのダイジェストを安全に比較するための関数 : std.getopt: big-coreでも数値のgcdができる。
- Bugzilla 17327: std.getopt: オプションの繰り返しが認識されない
- Bugzilla 17394: std.file.mkdirRecurseは"@safe"ではない
- Bugzilla 17557: std.jsonはパース時にUTFデコードを行うべきではない。
Druntimeのバグ
- Bugzilla 9275: [GC] removeRootはassert(0)を打つ。
- Bugzilla 12233: TypeInfo.initを使おうとすると、'this'がないためにコンパイラー・エラーになる。
- Bugzilla 13186: core/sys/posix/sys/uio.d が標準 lib にリンクされていない。
- Bugzilla 16856: libunwind のため、FreeBSD current (最終的に 12 になる予定) では D が動作しない。
dlang.org のバグ
- Bugzilla 8107: 浮動小数点リテラルが実装通りに指定されていない
- Bugzilla 17303: Systems Programmingのリンクの下のhref urlの"@system"型エラー。
- Bugzilla 17469: ソースコードを見る
- Bugzilla 17501: AST書き換えによる実行可能なunittest問題
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku