nlib
nlibメインページ

Windows, Linux, FreeBSD, OS X, Cygwin及び任天堂の開発環境に対応したライブラリの集合です。

nlibについて

nlibはWindows, Linux, FreeBSD, OS X, Cygwin及び任天堂の開発環境に対して同一のI/Fを利用したプログラミングが可能な、ユーザーランド上で動作するライブラリ群を提供することを目的として開発されています。 開発はsoftware centricに行われ、適切で現実的なコーディングルール(nlibのコーディングルール)と個別の開発環境からの独立性が確保されたI/Fと実装によって、複数の開発環境に対して同時並行的に高い品質と性能及び信頼性を維持しつつ行われることにフォーカスしています。

nlibが実装している機能

主に以下のような機能が実装されています。
  • XML及びJSONの読み書き
  • 高効率なメモリアロケータ
  • googletest互換のテストフレームワーク
  • SSE4.1/NEON両対応のコード開発を可能とするラッパーライブラリ
  • キーワード検索等のための簡潔データ構造ライブラリ
  • UTF-8の読み書きや正規化, UTF-16/UTF-32との変換
  • スレッド, ミューテックス, 条件変数, TLS, バリア, リードライトロック, アトミック変数, 等
  • システムメモリの取得と解放, 時刻の取得, ファイルの読み書き, 等
  • その他、多数のプラットフォームや複数のコンパイラに対応するための基底となるCリンケージの関数群やマクロ定義

nlibが動作する環境

現在は、以下の環境でのコンパイル及び動作が確認されています。
  • Windows上においては、
    • Visual Studio 2008, 2010, 2012, 2013の32bitスタティックライブラリのビルド(Express Editionも利用可)
    • Visual Studio 2012, 2013の64bit スタティックライブラリのビルド(Express Editionも利用可)
    • Visual Studio 2012, 2013の64bit DLLのビルド(Express Editionも利用可)
    • (最新の32bit)cygwin上のgcc(ver 4.9.3)
  • Linux上においては、
    • Ubuntu 15.04 (64bit)のgcc(ver 4.9.2)及びclang(ver 3.6, libstdc++)
    • Ubuntu 14.04LTS (32bit/64bit)のgcc(ver 4.8.2)及びclang(ver 3.4, libstdc++)
    • Ubuntu 12.04LTS (64bit)のgcc(ver 4.6.3)及びclang(ver 3.4, libstdc++)
    • CentOS 7.1 (64bit)のgcc(ver 4.8.3, libstdc++)
    • Fedora 22 (64bit)のgcc(ver 5.1.1, libstdc++)
  • FreeBSD 10.2 (64bit)上においては、clang(ver 3.4, libc++)
  • OS X(10.10, Yosemite)上においては、Xcode(ver 6.4)
  • CTR上でのarmccコンパイラ
  • Cafe上でのghsコンパイラ
コンパイラのバージョン等により、適宜C++11の機能を利用してコンパイルされるようになっています(nlibで利用しているC++11の機能)。

nlibのサポート方針等

サポート方法については、パッケージのリリース元にお問い合わせください。 FAQ 等も併せてお読みください。 なお、今後の開発予定やリリース予定日のドキュメント等は作成や公開されずに、現在の実装について本ドキュメント及びサンプルで説明される形となります。 サポート及びバグフィックスはその時点での最新バージョンに対して行われます。 特定のプロジェクトに対してのみの特別バージョン等の提供や特別扱いのサポートが行われることはありません。 これらは開発チームの規模を最小限に抑えるために必要なルールとなっています。
また、やむを得ず互換性が失われるような変更が予告なしに行われる場合もあります。 ご了承ください。
利用の際には利用する機能について受け入れテスト等で、期待通りの動作をするか、速度は十分にでるか、メモリ消費量等は許容範囲内かを事前に確認しておくのがよいでしょう。 受け入れテストを作成しておくことは、nlibのアップデートによるトラブルを回避するためにも役に立ちます。 そのような受け入れテストの作成にtestingライブラリを利用するのはよい考えです。
バグ報告は可能であれば、再現コードをnn::nlib::testing形式のテストコードとして記述してそれを報告に含めると迅速に修正されるかもしれません。

nlibのパッケージに関する説明

パッケージによって収録されているライブラリや対応プラットフォームが異なりますのでご注意ください。

ディレクトリ構成

以下のような構成になっています。
├── bin
│   └── cmake                 # Command-line tools
├── cmake                      # Common Cmake scripts
├── documents-ja(documents-en)
│   └── API                   # Reference Manual
│       ├── html              # HTML version of the Reference Manual
│       ├── nlib.chm          # HTML Help version of the Reference Manual
│       └── searchdata.xml    # Search index
├── include                    # Include files (in `system/include` for Cafe)
│   ├── nn
│   │   └── nlib
│   │       ├── exi
│   │       ├── heap
│   │       ├── msgpack
│   │       │   └── jsonrpc
│   │       ├── oss
│   │       ├── simd
│   │       ├── succinct
│   │       ├── testing
│   │       ├── threading
│   │       └── unicode
│   ├── lz4.h
│   ├── lz4hc.h
│   ├── lz4frame.h
│   ├── sqlite3.h
│   └── sqlite3ext.h
├── lib                        # Platform-specific library files (`system/lib` for Cafe, `libraries` for CTR)
└── samples                    # Source code for samples
    ├── cmake
    └── sources
        ├── exi
        ├── heap
        ├── misc
        ├── msgpack
        ├── oss
        ├── succinct
        └── testing

個別プラットフォームに関する説明事項

各種ライブラリの説明

miscライブラリ(libnx_misc.a, libnx_misc.so, nx_misc-vc120amd64.lib, nx_misc-vc120dllamd64.dll等)
このライブラリは、プラットフォームの差異を吸収する部分と、小規模なライブラリの集合となっている部分で構成されます。 多くのプログラムで使うであろう機能が実装されています。
具体的には以下のものを含みます。
  • 環境毎の違いを吸収するためのCリンケージを持つ関数群(nn/nlib/Platform.hに宣言されている)
    • 時刻, 時間の取得
    • OSからの(仮想)メモリの割り当てと解放
    • pthreadライクなスレッド
    • pthreadライクなTLS, ミューテックス, セマフォ, 条件変数, バリア, リードライトロック
    • 一回限りのスレッドセーフな実行(pthread_once相当)
    • アトミックなメモリの書き換えを行う関数
    • デバッガへのアクセス
    • ファイルハンドルと各種ファイルI/Oを行う関数
    • SIMD処理による高速化が施された文字探索関連関数群
    • UTF-8 <-> UTF-16, UTF8 <-> UTF-32等の文字列変換
    • printf系関数の環境毎の挙動の違いを抑制したprintf系関数の実装
    • 基本的なロックフリーデータ構造とアルゴリズム
    • コンパイラ毎の各種アトリビュートの違いを吸収するマクロ
  • InputStream, OutputStreamを基底とする各種ストリームを扱うためのクラス群
  • UTF-8文字列をストリームからvalidationしつつ読み書きするためのクラス(TextReader, TextWriter)
  • バイナリデータをストリームから読み書きするためのクラス(BinaryReader, BinaryWriter)
  • ユニコードを扱うためのクラス
  • スレッドを扱うためのクラスや関数群
  • 日時や時間情報を扱うためのクラスや関数群
    • 日時を加減算したり、日付文字列(RFC2822, W3CDTF)をパースしたり作成するクラス(DateTime, TimeSpan)
  • URIを扱うためのクラスや関数群
    • URIパーサー(Uri)
    • URI Template(RFC6570) を処理するためのクラス(UriTemplate)
    • 環境ごとに異なる文字列となることの多いファイルパスをURI文字列に標準化するためのクラス(NativePathMapper)
  • 非同期ファイルアクセスを行うためのクラス(threading::AsyncFileIo)
  • 各種ガシェットクラス
    • std::unique_ptr代替クラス(UniquePtr)。C++11ではstd::unique_ptrtypedefされる。
    • シングルトンクラス(Singleton, SimpleSingleton)
    • 拡張時にメモリの解放(と要素のコピー)が必要とならないstd::vector類似クラス(Nlist)
    • コマンドライン文字列を解析するためのクラス(Nflags)
    • CRC(Crc32)
名前空間はグロバール名前空間及びnn::nlib, nn::nlib::unicode, nn::nlib::threadingです。
exiライブラリ(libnx_exi.a, libnx_exi.so, nx_exi-vc120amd64.lib, nx_exi-vc120dllamd64.dll等)
バイナリXMLを読み書きするライブラリです。テキストのXMLを読み書きすることも可能です。 XML名前空間をサポートしていて、プログラミングの簡単なPull parsing APIを備えています。
名前空間はnn::nlib::exiです。miscライブラリに依存します。
heapライブラリ(libnx_heap.a, libnx_heap.so, nx_heap.lib, nx_heap-vc120dllamd64.dll等)
マルチスレッドでのメモリの確保と解放に関して最適化されたヒープライブラリで、nmalloc()/nfree()(とそれらを実装するheap::CachedHeap, heap::CentralHeap)は、多段のフリーリストを利用することでフラグメンテーションの抑制を行い、性能の劣化を抑えています。 また、小さいサイズのメモリの場合は各スレッド毎にキャッシュを保持することにより、ロックをかけずにメモリの割り当てと解放が可能になっていてマルチスレッドでの性能劣化を抑制しています。 フリーリスト内のポインタはマングルされているか割り当て状態がチェックされていて、外部からのメモリの書き換えによる不正利用が行いにくいように実装されています。
名前空間はnn::nlib::heap及びグローバル名前空間(Cリンケージの関数)です。 miscライブラリに依存します。
succinctライブラリ(libnx_succinct.a, libnx_succinct.so, nx_succinct-vc120amd64.lib, nx_succinct-vc120dllamd64.dll等)
簡潔データ構造を扱うためのライブラリです。 簡潔データ構造とは、圧縮したままの状態で中身の検索を行うことができるデータ構造とお考えください。
succinctライブラリは以下のものを含みます。
  • 各種簡潔ベクトルクラスの実装
  • 括弧列(Balanced Parentheses)を実装したクラス
  • LOUDS(Level-Order Unary Degree Sequence)を実装したクラス
  • Trieの実装
  • Aho Corasick法のための高圧縮なインデックスを作成し、文字列の検索に利用するためのクラス
名前空間はnn::nlib::succinctです。miscライブラリに依存します。
msgpackライブラリ(libnx_msgpack.a, libnx_msgpack.so, nx_msgpack-vc120amd64.lib, nx_msgpack-vc120dllamd64.dll等)
MessagePackとJSONを読み書きするためのライブラリです。 CSVをパースするクラスも含まれています。
msgpackライブラリは以下のものを含みます。
  • ストリームからJSONを読み書きするためのクラス
  • ストリームからmsgpackを読み書きするためのクラス
  • メモリ上のmsgpackを高速に解釈するためのクラス
  • CSVを読み込むためのクラス
  • 読み込んだJSONやmsgpack、及びCSVのデータを保持するためのクラス
  • JSON-RPCのための実装
名前空間はnn::nlib::msgpackです。miscライブラリに依存します。
testingライブラリ(libnx_testing.a, libnx_testing.so, nx_testing-vc120amd64.lib, nx_testing-vc120dllamd64.dll等)
移植性の高いテストコードを記述するためのライブラリです。 googletestで書かれたテストとある程度のソースコード互換性を持つテストフレームワークです。
名前空間はnn::nlib::testing(googletestとの互換性のためtesting名前空間にエイリアスされている)です。miscライブラリに依存します。
ossライブラリ(libnx_oss_bsdiff.a, libnx_oss_sqlite3.a, libnx_oss_lz4.a等)
オープンソース・ソフトウェア(OSS)のコード、及びOSSから派生したコード、及びOSSにアクセスするためのコードが格納されます。 利用する場合にはOSSライセンスの処理が必要となります。
現在は、以下のライブラリが含まれています。それぞれが別々のライブラリファイルとしてビルドされています。
  • bsdiffbzlib2ではなくzlibを使うように改変してライブラリ化したもの、及びそのコマンドラインプログラム
  • SQLite3nlibが提供しているI/Fを利用して動作するように改変したもの、及びそのコマンドラインシェル
  • LZ4zlibに比べて圧縮では約20倍、展開では約5倍の速度で動作するアルゴリズムです。
名前空間はnn::nlib::oss及びグローバル名前空間(Cリンケージの関数)です。 heapライブラリとmiscライブラリに依存します。
simdライブラリ(大半がインライン関数でmiscライブラリに含まれる)
SIMD命令を用いることにより、プログラムを大幅に高速化することが可能です。 simdライブラリは、SSE4.1とNEONに両対応したコードを記述するためのライブラリです。
各種整数と単精度浮動小数点数の計算に対応していて、高速な演算を行うコードを記述可能です。
なお、単精度浮動小数点数の計算については、SSEやNEONに対応していない環境でも利用することが可能です。
CAFEにおいてはpaired singleを利用するように最適化されています。
つまり、同一のコードを書くことで、下記の環境に対応することができます。
  • x86系プロセッサではSSE4.1を利用した高速化が適用されたコードにコンパイルされます。
  • NEONをサポートするプロセッサではNEONを利用した高速化が適用されたコードにコンパイルされます。
  • CAFEではpaired singleを利用した高速化が適用されたコードにコンパイルされます(浮動小数点演算のみ, 4次元ベクトル等を値返しするI/FのためCAFE-SDKの行列計算等よりかなり遅い)。
  • CTRではgenericなコードがコンパイルされます(浮動小数点演算のみ)。
名前空間はnn::nlib::simdです。

nlibで利用しているC++11の機能

nlibではコンパイラの種類やバージョンによって、C++11の機能を利用してコンパイルされています。 以下にC++11の機能とnlibで利用できる互換用マクロ等、及びC++11を利用してコンパイルされる コンパイラについて表にまとめておきます。 なお、clangについてはバージョンではなく__has_feature()マクロ及び__has_include()マクロによって判定されます。
その他の環境ではC++11の機能は利用されません。
C++11の機能 識別用マクロ C++03互換用マクロやtypedef等 Visual Studio gcc
Rvalue references NLIB_CXX11_RVALUE_REFERENCES なし 2010 4.3
Variadic templates NLIB_CXX11_VARIADIC_TEMPLATES なし 2013 4.7
Static assertions NLIB_CXX11_STATIC_ASSERTIONS NLIB_STATIC_ASSERT() 2010 4.3
Null pointer constant NLIB_CXX11_NULL_POINTER_CONSTANT nn::nlib::nullptr, nn::nlib::nullptr_t 2010 4.6
Deleted functions NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS NLIB_DISALLOW_COPY_AND_ASSIGN() 2015 4.4
Explicit conversion operators NLIB_CXX11_EXPLICIT_CONVERSION_OPERATORS NLIB_SAFE_BOOL() 2013 4.6
Alias templates NLIB_CXX11_TEMPLATE_ALIAS なし 2013 4.7
constexpr NLIB_CXX11_CONSTEXPR NLIB_CEXPR 2015 4.7
char16_t, char32_t NLIB_CXX11_NEW_CHARACTER_TYPES nlib_utf16_t, nlib_utf32_t 2015 4.4
alignas NLIB_CXX11_ALIGNMENT_SUPPORT NLIB_ALIGNAS() 2015 4.8
Explicit virtual overrides NLIB_CXX11_EXPLICIT_VIRTUAL_OVERRIDES NLIB_OVERRIDE 2012 4.7
final NLIB_CXX11_EXPLICIT_VIRTUAL_OVERRIDES NLIB_FINAL 2012 4.7
noexcept NLIB_CXX11_NOEXCEPT NLIB_NOEXCEPT 2015 4.6
Range-based for NLIB_CXX11_RANGE_BASED_FOR なし 2012 4.6
lambda NLIB_CXX11_LAMBDAS なし 2012 4.7
Delegating constructors NLIB_CXX11_DELEGATING_CONSTRUCTORS なし 2013 4.7
std::unique_ptr NLIB_CXX11_UNIQUEPTR nn::nlib::UniquePtr 2013 4.7
#include <random> NLIB_CXX11_STDLIB_RANDOM なし 2013 4.8
#include <chrono> NLIB_CXX11_STDLIB_CHRONO nn::nlib::DateTime との変換 2012 4.7
#include <atomic> NLIB_CXX11_STDLIB_ATOMIC NLIB_MEMORY_ORDER_RELEASE2012 4.8
#include <array> NLIB_CXX11_STDLIB_ARRAY なし 2012 4.5
#include <unordered_map>
#include <unordered_set>
NLIB_CXX11_STDLIB_UNORDERED なし 2012 4.5
#include <tuple> NLIB_CXX11_STDLIB_TUPLE なし 2012 4.5

nlibのコーディングルール

nlibの基本的なコーディングルール

nlibのコーディングルールは、(最新の)Google C++ Style Guide(若干古いが日本語訳)に若干の変更と緩和を行ったものになっています。
Google C++ Style Guideを利用する理由については以下の点を挙げることが可能です。
  • コーディングルールの文書にアクセスしやすい。公式ではないにしろ翻訳もされている。
  • ゲーム業界での一般的なコーディングルールと同様にC++例外とRTTIの利用を禁止している。
  • 今までに継続的に更新されている。
  • 更新毎のコーディングルールの変化は穏当なもので、突然全く変わってしまう、といったことがなかった。
  • 5年後においてもメンテナンスされていることが期待できる。
変更点及び緩和点は以下のとおりです。

コーディングスタイルのチェックと矯正

コーディングスタイルは、cpplintを用いて簡単にチェックすることができます。
警告基準は以下のように若干緩和されています。
  • --linelength=100 を指定して、1行は100行以内であるとしている。
  • cpplintのlegal/copyright, build/include_alpha, whitespace/newlineによる警告は抑制されている。
  • std::swap()の利用に際してヘッダalgorithmのインクルードは要求されないよう緩和している。
Makefileに以下のようなルールを書いておけば、手軽にチェックをかけることができます。
cpplint:
-./cpplint.py --linelength=100 \
$(shell find ./include/ -path "*.h") \
$(shell find ./sources/ -path "*.cpp" -or -path "*.h") 2>&1 | tee cpplint.log
また、nlibclang-checkによるソースコードの検査にも対応しています。 cmakeでMakefileを生成すると、compile_commands.jsonというファイルが一緒に作成され、clang-checkはこれを利用して動作します。
詳しくは、clangマニュアルのJSON Compilation Database Format Specification を御覧ください。

コーディングスタイルの自動整形

clang-formatを用いるとインデント等を好みの方法に統一することが可能です。 nlibで用いている設定が .clang-formatファイル(clang3.5用です)としてnlibのパッケージに含まれていて利用することが可能です。 まず、clang-formatで一括してソースコードの大まかな変換を行い、cpplint.pyでより細かい日常的なチェックを行うことをおすすめします。

コンパイル時の警告の設定等

複数のコンパイラや実行環境でテストすることにより、コードの品質を向上させることが可能です。 各コンパイラで比較的厳しめのワーニングレベルを設定します。
  • Visual Studio 2008 以降の全てのバージョンでコンパイルを成功させること。/W4 オプションを利用した上で原則として警告を無くすこと。
    • pragmaによる警告の抑制は容認される。
    • 常に最新のUpdateを適用し、コードで_MSC_FULL_VERをチェックすること。
    • 定期的にVisual Studioのコード分析を利用して警告を減らしておくこと。
  • cygwin(32bit)及びUbuntuにおいてバイナリパッケージで手に入る最新版のgcc, clangでコンパイルを成功させること。-Wall -Wextraを利用した上で原則として警告を無くすこと。
    • cygwinは常に最新にしておくこと。 cygwinのアップデートでビルド動作がおかしくなった場合はビルドスクリプトの方を修正すること。
    • pragmaによる警告の抑制は容認される。
    • -Wstack-usage=65536 を利用し、スタックを使い過ぎないようにすること。
    • -fstack-protector を利用すること。
  • CAFEの開発環境で警告なしにコンパイルを成功させること。
  • CTRの開発環境でコンパイルを成功させること。
  • 各種64bit環境でも同様にコンパイルが成功することが望ましい。
  • doxygenの警告もなくしておくこと。
cpplint.pyの警告をゼロにし、各種環境でのコンパイルとテストを通すことがnlibの基本的なリリース基準になっています。

追加のルールや慣習

  • 原則として、Platform.hで定義される関数の宣言や実装以外のコードは利用する可能性のある全環境でコンパイルできるコードで記述されている必要がある。ただしSIMD命令等によって機種別に最適化されたコードが含まれることは容認される。
  • NLIB_FINAL, NLIB_OVERRIDE等のマクロやtypedefを利用してC++11の機能を安全に導入し、C++11やC++14以降への連続的な移行を可能にすること。
  • エラー値は可能であればPOSIX.1 2008のエラーコードを利用し、エラー値の型はerrno_tとすること(https://www.jpcert.or.jp/sc-rules/c-dcl09-c.html)。
    これは、
    typedef int errno_t;
    とされていて、エラー値であることが分かりやすくなっている。
    • POSIX.1 2008のエラーコードの値は十分に小さい整数値なので、ARMのようなプロセッサで効率的に即値ロードできる。
  • 例外・RTTIを利用せずに実装しなくてはならないが、nlibを利用する側のコードがこれらを利用する場合を想定したコードを記述すること(例外安全性等)。
  • malloc(), free()等はnlib_malloc(), nlib_free()等を利用すること。
  • newは、new (std::nothrow)を利用すること。
  • ライブラリ内部でグローバルのnewをオーバーロードしてはならない。
    • このオーバーロードは依存関係のないはずの他のライブラリの挙動に影響を与えてしまうのでやってはならない。
  • マルチバイト文字列はASCII文字列かUTF-8文字列のどちらかにすること。
    • WindowsにおいてもUTF-8で渡す実装でなくてはならない。パス文字列やnlib_printf()に渡す文字列はnlib内部でUTF-16に変換された上でWin32 APIに渡されている。
    • コマンドライン引数処理(Nflags)は例外
  • char型が符号付きでも符号無しでも正常に動作するようにしておくこと。
    • signed charを用いれば明示的に符号付きの値として扱うことができる。
  • wchar_tに関してはwchar_tが16bitの場合はUTF-16として、32bitの場合はUTF-32としてサポートすること。
    • NLIB_WCHAR_SIZEが2か4のいずれかに定義されるのでそれで判断することができる。
  • UTF-16文字の型には nlib_utf16_t, UTF-32文字の型には nlib_utf32_tを利用すること。
    • これらはC++11の場合はそれぞれ、char16_t, char32_ttypedefとなる。
  • 原則としてUTF-16やUTF-32より、UTF-8を優先すること。
    • UTF-8の方がメモリ消費量が少なく、複数プラットフォームへの対応が容易である。
    • サロゲートペアや結合文字の存在により、UTF-16やUTF-32を利用しても必ずしも1文字を固定長で表現することができない。
    • nlib_strcplen_ex()を使うことにより、validationを行いつつコードポイント数とバイト長を同時に求めることができる。更にSIMDがサポートされている場合にはこの動作をより高速に行うことができる。
  • ムーブコンストラクタ、ムーブ代入演算子を定義する場合には、NLIB_CXX11_RVALUE_REFERENCESで切り分けられたコード内での定義の他に、C++03でも同等の機能を実現できるよう、以下のようなメンバ関数を定義しなければならない。
    Type::Type(Type& rhs, ::nn::nlib::move_tag); // ムーブコンストラクタと同じ動作をさせる。
    Type& Type::assign(Type& rhs, ::nn::nlib::move_tag); // ムーブ代入演算子と同じ動作をさせる。
    boost::moveのような素晴らしい手法も存在するが、結局完全な互換性は達成できないのでこの手法は利用しない。
  • type_traitsの利用は慎重に行うこと。C++11のこの機能はコンパイラやそのバージョンによってバグがあったり実装が抜けていたり、といったことがある。 nn/nlib/TypeTraits.h に一応のラップが行われているが、やむを得ない場合にのみ利用すること。
  • Non-copyable Mixinを使わないこと。
    • 代わりに、NLIB_DISALLOW_COPY_AND_ASSIGN()を使うこと。
    • 継承階層を増やすことが、ソースコードの解析プログラムやドキュメンテーションシステムに悪影響を与えることがある。
  • C標準ライブラリのヘッダは .h形式のものをインクルードすること。理由は以下の2つ。
    • C++標準ライブラリのヘッダが壊れているような状況に対応するため
    • nn/nlib/Platform.hはCコンパイラでコンパイル可能である必要があることから、xxx.h形式のヘッダをインクルードする必要があるため、nlib内部でxxx.h形式とcxxx形式の両方の形式でインクルードすることに起因するコード上の混乱を抑制するため。
  • テストをgoogletest形式で記述して、どのプラットフォームでも単体テストが実行されている状態にしておくこと。
    • 特定のプラットフォーム向けの実装のバグや、特定の環境でしか見つからないバグを見つけることが容易になる。
    • どのプラットフォームでも実行する共通のテストと、PCのみで実行するテストを分けておくとよい。
      • PCのようなパワーのある環境では、ストレスをかけるテストや総当りのテストが記述しやすい。
      • PC環境ではOSSをテストプログラムで利用することが容易で、便利なことがある。
      • Windows環境ではDirectX等をテストプログラムで使うことができ、便利なことがある。
      • googletestが動作しない環境では、 testingライブラリを利用することが可能である。
      • gccでコンパイルしている場合は、gcovrを使うことでテストのカバレッジを自動計測することができる。
  • リファレンス・マニュアルはdoxygen形式で記述すること。
    • doxygenは継続的に改良されていて、5年後においても改良されつつ存在していることが期待できるドキュメンテーションシステムであるから。
    • doxygenコメントは各インクルードディレクトリにmanual.hというファイルを配置して、そこに記述すること。英語版のマニュアルの場合はmanual_en.hである。こうすることで複数言語版を同じレポジトリで管理することができる。
  • 可能であればcmakeでビルドできるようにすること。
    • cmakeはWindowsとLinuxの両方で動作するようなC/C++のコードを記述する場合において代表的な選択肢となっている。

CMakeについての紹介

サンプルのビルドにはcmakeを利用することが可能です。 CMakeはかつてMySQL(MariaDB)のビルドに採用されていることで有名でした。 現在はC/C++で記述されていてWindowsとLinuxの両方に対応している各種ソフトウェアの標準的なビルドシステムとしての地位を確立しています。 多くのOSSにCMakeLists.txtというファイルが含まれていることに気づいた方も多いと思います。 cmakeを利用すると、このCMakefiles.txtというスクリプトファイルを記述することで、GNU makeのMakefileやVisual Studio及びXcodeのプロジェクト等を生成することが可能です。
cmakeを利用するメリットは以下のとおりです。
  • 多くのシステムとコンパイラをサポートしています。
    • Windows, Linux, MacOS X, FreeBSD, IRIX, AIX, Sun OS, HP-UXなどに対応しています。
    • Visual Studioの各バージョン, Eclipse CDT, Xcodeといった複数のIDEに対応しています。
    • Visual Studioに関してはExpress Editionも利用可能ですし、最新バージョンへの対応もRC版が出る頃には完了しています。
    • 比較的簡単な設定を行うことでクロスコンパイルに対応することが可能です。
  • ビルド用の一時ファイル等がソース・ファイルのある場所を汚しません。つまりOut-Of-Treeビルドが可能です。複数の環境向けのバイナリを1つのソースツリーからビルドしたい場合は必ず必要となる機能です。
  • cmakeから別個独立した複数のプロジェクトを生成して利用することができるので、並列ビルドが容易です。
  • 利用するライブラリやツールの場所を自動的に探してくれます。
  • 利用するライブラリのインクルードパスの設定やライブラリのリンクがクロスプラットフォーム化されていて、環境ごとにパスが違ったとしても統一した記述が可能です。
  • インストーラを作成することができます(CPack)
    • NSIS, deb, rpm, tgz, 他
  • テストの実行や管理が可能です(CTest)
nlibではcmakeを利用することで、Visual Studioの各バージョンに対応したソリューションファイル,Unix, Cygwin用のMakefile等を生成しプログラムをビルドすることが可能となります。
また、パッケージ内の ./cmake/toolchain-cafe.cmake, ./cmake/toolchain-ctr.cmakeファイルにクロスコンパイル用の各種設定がされていて、CAFE/CTR版のサンプルプログラムもcmakeを利用してMakefileを生成し、ビルドすることが可能です。 なお、nlibのCAFE版及びCTR版には標準のmake, omake用のスクリプトも用意されています。

cmakeを使う際の注意点

  • Visual Studioのプロジェクトを生成するためにはWindows版のcmakeをインストールする必要があります。
  • cygwinのMakefileを生成するためにはcygwin版のcmakeをインストールする必要があります。
  • cmakeではDebugビルド, Releaseビルド毎に別々のディレクトリにVisual StudioやXcodeのプロジェクトやMakefileを出力する必要があります。

ビルド環境構築の自動化について

Windows環境ではchocolatey, cygwin環境ではapt-cyg を用いることでコマンドラインでソフトウェアのインストールやアップデートを行うことができるようになります。 コマンドラインで実行できるのでスクリプトによる自動化が容易で、これらはLinux環境のapt-getに似ています。 これらのツールを利用するスクリプトを提供することで、ビルド環境等の構築を簡単にすることが可能になります。

chocolateyの利用

以下のコマンドをコマンドプロンプトで実行するとchocolateyをインストールすることができます。
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin
これでコマンドラインから各種プログラムをダウンロードしてインストールすることが可能になります。
以下に例を示します。
cinst powershell4 # PowerShell4.0のインストール
cinst git.install # Git for Windowsのインストール
cinst cmake # cmakeのインストール
cinst doxygen.install # doxygenのインストール
cinst GraphViz # GraphVizのインストール
cinst VS2013.4 # Visual Studio 2013 Update4 のインストール
cinst VS2012.4 # Visual Studio 2012 Update4 のインストール
cinst windows-8-1-sdk # Windwos SDK 8.1のインストール
cinst 7zip.commandline # コマンドライン用7zipのインストール
以下のコマンドでアップデートやアンインストール等を行うことができます。
cup all # インストールしたパッケージをアップデート
cuninst [packageName] # パッケージをアンインストール
cver all -localonly # インストールしたパッケージの確認

apt-cygの利用

apt-cygのインストール前にcygwinにはGnuPG, wgetがインストールされている必要があります。 wgetについては、/etc/wgetrcにプロキシの設定を適切に記述する必要があります。
apt-cygはcygwinのパッケージには含まれません。ダウンロードしてインストールする必要があります。 apt-cygをブラウザ等に表示して保存しても大丈夫です。
git clone https://github.com/kou1okada/apt-cyg.git
cd apt-cyg
chmod +x apt-cyg
cp ./apt-cyg /usr/local/bin
次にミラーの設定をしてアップデートをします。
apt-cyg --mirror http://ftp.iij.ad.jp/pub/cygwin/
apt-cyg update
これでコマンドラインから各種プログラムをダウンロードしてインストールすることが可能になります。
以下に例を示します。
apt-cyg install tar gzip # tar/gzipのインストール
apt-cyg install make # makeのインストール
apt-cyg install cmake # cmakeのインストール
apt-cyg install gcc-g++ binutils # gccのインストール
apt-cyg install zlib zlib-devel # zlibのインストール
apt-cyg install python python-setuptools # pythonのインストール

FAQ

このセクションでは、nlibを利用する際によく遭遇する状況と対処法について説明します。
new/deleteのオーバーロード
nlibはメモリの確保にはnew (std::nothrow)を利用しています。 アプリケーション、又は他のライブラリでnew/deleteをオーバーロードする場合には、operator new(size_t, const std::nothrow_t&)もオーバーロードする必要があります。
詳しくはheap_replace_mallocサンプルを御覧ください。
malloc等の置き換え
nlibmalloc, freeを直接使うことはしていません。代わりにnlib_malloc(), nlib_free()等を利用します。 これらの関数はweak関数として定義されていてユーザーが定義することで置き換え可能です。
ユーザー定義のヒープを利用したい場合にはこれらの関数を置き換える必要があります。 必要なのは、以下の関数です。
void* nlib_malloc(size_t size);
void nlib_free(void* ptr);
void* nlib_calloc(size_t nmemb, size_t size);
void* nlib_realloc(void* ptr, size_t size);
void* nlib_memalign(size_t alignment, size_t size); // not defined if WIN32 or CTR
詳しくはheap_replace_mallocサンプルを御覧ください。
コンパイルオプションについて
パッケージのcmake/common.cmake.win32等のファイルにプラットフォーム毎のスイッチ等の定義が記述されています。 参考にしてください。
コンパイルすると"MACRO_XXXX not defined, compile may fail"と表示される
コンパイラへのコマンドライン引数でMACRO_XXXXを定義するようにしてください。
コンパイルすると"Please update your Visual Studio NNNN"と表示される
ご利用のVisual Studioの最新アップデートをインストールしてください。
私達のプロジェクトで最新版を利用すべきかどうか教えてください。
それはnlibを利用するプロジェクトの判断に委ねられます。 受け入れテストを記述しておくことで、そういった判断をより容易にすることができます。 ただし、サポートの対象となるのは最新版のみです。ご了承ください。
私達のプロジェクトのために専用パッケージをリリースしてください。
プロジェクトのニーズはプロジェクトの数だけ存在します。例えば、以下のようなものがあります。
  • 私達にはライブラリXは必要ないので取り除いたものをリリースしてください。
  • 私達にはサンプルを取り除いたものをリリースしてください。
  • 私達はVisual Studio 2012(32bit)を使っているので、Visual Studio 2012用のソリューションを構築済みの状態にしてリリースしてください。
これらのニーズに柔軟に応えることを可能にするために、nlibを利用するプロジェクト側においてnlibのパッケージを再構成、再パッケージを行いプロジェクト内においてのみ再配布することが認められています。
nlib_printf()でShift JIS文字列が表示できません。
nlib_printf()の入力文字列はUTF-8である必要があります。
半年前のリリースにバグがあるので修正パッチをリリースしてください。
バグの修正は最新版に反映されます。次回以降のリリースを組み込んでください。
私達のライブラリやフレームワークのやり方に合わせて貰えませんか?
それが公開されていて、Windows/Linux/FreeBSD/OS X/Cafe/CTRの全てに対応しているものならば可能かもしれません。 ご連絡ください。

Changelogs

2015-09-08

  • FreeBSD 10.2での動作確認を開始しました。これに伴いFreeBSD 10.1での動作確認を終了しました。
  • miscライブラリにDynamicAlignedStorageクラスを追加しました。
  • miscライブラリにLockFreeUnitHeapクラスを追加しました。
  • miscライブラリにLockFreePipeクラスを追加しました。
  • miscライブラリにLockFreeStackクラスを追加しました。
  • miscライブラリにLockFreeQueueクラスを追加しました。
  • miscライブラリにLockFreeInit()関数を追加しました。
  • miscライブラリにLockFreePriorityQueueクラスを追加しました。
  • miscライブラリにLockFreeBroadcastQueueクラスを追加しました。
  • nmalloc_aligned()で4096より大きいアライメントを指定できるようになりました。
  • nmalloc(), nrealloc()で大きすぎるサイズを指定した場合にNULL以外を返すことがある問題を修正しました。
  • Crc32クラスの計算速度の改善を行いました。
  • 優先度つきのメッセージキューをロックフリーで利用した場合にデストラクタが適切に実行されないバグを修正しました。
  • deprecatedとなっていたファイルや関数を削除しました。

2015-07-28

  • スレッド間でのオブジェクトの通信に対応した優先度つきのメッセージキューを追加しました。nlib_mq_open(), nlib_mq_send(), nlib_mq_receive()等の関数が追加されていて、ブロッキングキュー、ノンブロッキングキュー、ロックフリーキューに対応しています。
  • リードライトロック用の条件変数として、nlib_condrwlock型と関数群を追加しました。リードロック、ライトロックのどちらか一方をアンロックして待つことができます。C++用のクラスはnn::nlib::threading::CondVarForSharedCriticalSectionとなります。
  • 新たにnlib_atomic_compare_exchange32(), nlib_atomic_compare_exchange64(), nlib_atomic_compare_exchangeptr()等のアトミック操作関数を追加しました。メモリオーダーの指定に対応しています。
  • 今まで存在していた、nlib_atomic32_xxxxx(), nlib_atomic64_xxxxx()等のアトミック操作関数をdeprecatedとしました。
  • nlib_nsを名前空間nn::nlibのエイリアスとして定義しました。
  • その他細かい変更と修正

2015-06-26

  • Fedora 22に対応しました。gcc 5.1を用いたビルドに対応しています。
  • FreeBSD 10.1での動作確認を開始しました。これに伴いFreeBSD 10.0での動作確認を終了しました。
  • ossライブラリに含まれるLZ4をバージョン1.7.0にアップデートしました。
  • ossライブラリにnn::nlib::oss::Lz4InputStream及びnn::nlib::oss::Lz4OutputStreamを追加しました。
  • LZ4を利用したコマンドライン圧縮ツールlz4_nlibを追加しました。
  • miscライブラリにHandleMakerクラスを追加しました。ハンドル(32bit整数値)と何らかのオブジェクトの関連付けの実装をサポートするためのクラスです。
  • miscライブラリにnlib_spinlock_init(), nlib_spinlock_lock(), nlib_spinlock_trylock(), nlib_spinlock_unlock()関数を追加しました。
  • miscライブラリにnlib_thread_exit(), nlib_thread_exit_cpp()関数を追加しました。
  • miscライブラリにnlib_thread_attr_setstack(), nlib_thread_attr_getstack()関数を追加しました。それに伴い、NLIB_THREAD_ATTR_KEY_STACKADDRマクロは削除されています。
  • miscライブラリにnlib_error_string()関数を追加しました。
  • miscライブラリのthreading::ThreadSettingsクラスの仕様が変更になり、nlib_thread_attrをラップするようになりました。ソースコードレベルの互換性が失われるので関連するコードの修正が必要となります。
  • nmallocの動作を環境変数NLIB_NMALLOC_DISABLE_TLSCACHE, NLIB_NMALLOC_HEAPSIZE, NLIB_NMALLOC_MODEでカスタマイズできるようになりました。
  • nmalloc_aligned()が指定されたアライメントのメモリを割り当てないことがある問題を修正しました。
  • nmalloc_heaphash()のハッシュの品質を改善しました。
  • 2015-05-26版でtestingライブラリのサンプルがXMLをファイルに出力しなくなった問題を修正しました。
  • nlib_strerror()がdeprecatedとなりました。
  • threading::CondVar::Init()がdeprecatedとなりました。
  • 各プラットフォーム用コードにおける様々な改良及びバグ修正
  • その他細かい変更と修正

2015-05-26

2015-04-21

  • CentOS 7.1に対応しました。gccを用いたビルドに対応しています。
  • リファレンス・マニュアル(英語版)のレイアウトの改善を行いました。
  • その他細かい変更と修正

2015-03-31

  • リファレンス・マニュアルのレイアウトの改善を行いました。
  • Visual Studio 2012用の64bitスタティックライブラリをパッケージに追加しました。
  • Visual Studio 2012, 2013用の64bit DLLをパッケージに追加しました。
  • ossライブラリのライブラリファイルがOSS毎に分割されました。 スタティックライブラリではなく、DLLやシェアードライブラリではリンク時のデッドコードストリップという手段では該当OSSのバイナリを取り除くことができないことが理由となります。
  • デバッグビルドのライブラリファイルの基底名(basename)の末尾に'_d'がつくようになりました。意図しないDLLやシェアードライブラリをダイナミックリンクしてしまう間違いを避けるための措置です。
    • ただし、CAFE及びCTRのライブラリファイルは例外となります。
  • ライブラリのデバッグビルドとリリースビルドを同一のディレクトリに格納するように変更しました。デバッグビルドとリリースビルドのファイル名が同一ではなくなったからです。
    • ただし、CAFE及びCTRのライブラリファイルは例外となります。
  • Visual Studio用のビルドの場合、ライブラリファイルの基底名の後方にバージョンとビルド設定を表現する文字列が追加されます。それに伴い、バージョンとビルド設定ごとのディレクトリは作成されず、msvcというディレクトリに統一されます。
    • 例えば、Visual Studio 2013(32bit, static library)のライブラリファイルはnx_misc-vc120.lib, nx_misc-vc120_d.libのように命名されます。
  • RPATHを設定できる環境ではコマンドラインツールは相対パスによりシェアードライブラリを参照するようになりました。この変更によりLD_LIBRARY_PATHの設定が不要になります。
  • DateTimeクラスがasctime形式の読み書きに対応しました。
  • その他細かい変更と修正

2015-02-23

  • リファレンス・マニュアル(このドキュメント)に英語版が追加されました。
  • OS Xに対応しました。xcode(clang)を用いたビルドに対応しています。
  • PC版のパッケージにCAFE/CTR用にコンパイルされたライブラリが追加されました。
  • nlib_mlock(), nlib_munlock()を追加しました。
  • msgpack::MpObject がC++11標準ライブラリのarray, unordered_map, tupleの読み書きに対応しました。
  • NLIB_VIS_HIDDEN , NLIB_VIS_PUBLIC マクロを追加しました。
  • Visual Studio 2010以降のビルドにおいて、CRTをDLL版を利用するよう変更しました。
    • /MT, /MTd オプションがそれぞれ、 /MD, /MDd オプションに変更されました。
  • cygwin環境以外のgcc/clangでのライブラリのコンパイルに-fvisiblity=hidden, -fvisibility-inlines-hidden オプションを追加しました。 これによりライブラリが公開するシンボルの数が減少しています。
    • 一般にシェアードライブラリのロード時間を改善するとされています。
  • cmakeを利用する場合は、3.1.0以降のバージョンが必要となります。
  • nn::nlib::threading::CondVarFallbackがdeprecatedになりました。将来のリリースにおいて削除されます。
  • その他細かい変更と修正

2015-01-14

2014-12-10

2014-11-18

  • testing ライブラリの改良を行いました。
    • --gtest_filter, --gtest_shuffle, --gtest_random_seed, --gtest_print_time オプションをサポートするようになりました。
    • --help オプションをサポートするようになりました。
  • heapライブラリにおいて、特定の状況でメタデータが破壊されることがあるバグを修正しました。
  • その他細かい変更と修正

2014-11-07

  • Readme-ja.htmlの追加
  • その他細かい変更と修正

2014-11-04

  • heapライブラリの性能を改善しました。
  • nmalloc_get_settings() を追加しました。
    • nmallocを利用の場合にg_NMallocSettingsを設定する代わりにnmalloc_get_settings()を利用してください。
  • nlib_gen_random() を追加しました。
  • nn::nlib::succinct::AhoCorasickBuilder の性能を改善しました。
  • nn::nlib::threading::ThreadPool の性能を改善しました。
  • ossライブラリに収録されているSQLiteをバージョン3.8.7にアップデートしました。
  • PC版の nrealloc() において物理メモリが適切に割り当てられないことがあるバグを修正しました。
  • SIMD最適化された nlib_strcplen_ex() でエラーが検出されないことがあるバグを修正しました。
  • その他細かい変更と修正

2014-10-01

  • CTR版の nlib_tls_alloc() でデストラクタ関数の指定が可能になりました。
    • 今回のリリースからCTR-SDK10.0以降が必要となります。
  • heapライブラリのサンプルにgameheapサンプルを追加しました。
    • オブジェクト毎、モジュール毎、スレッド毎に別個のメモリ空間にヒープを構築して利用するサンプルです。
    • 異なる複数のヒープを利用することにより、メモリ関連のバグのリスクを減らすことが可能かもしれません。
    • 各ヒープはスレッドセーフかつフラグメンテーションの発生を抑制して動作します。
    • ゲームプログラム用のヒープとして実装されがちなI/Fをheapライブラリのヒープを用いて実装しています。
  • heapライブラリのnmallocのスレッドキャッシュの領域がリークすることがあるバグを修正しました。
    • スレッド終了時にnlib_tls_getvalue()がNULLを返す環境においてこのバグは発生していました。
  • nmalloc_thread, nmalloc_realloc, nmalloc_malicious, speeddemoサンプルを削除し、各サンプルの内容をnmalloc_simpleサンプルに統合しました。
  • exiライブラリのテキストのXMLパーサー利用時に、テキストノードの文字列がアロケータの削除以前に無効となる動作を修正しました。
    • バイナリのXMLパーサーと同様にアロケータの削除時まで各テキストノードの文字列が有効となるよう修正。
  • exiライブラリのXmlStreamEventLogger を削除しました。
  • その他細かい変更と修正

2014-09-03

  • PC環境におけるマクロ定義のチェックの改善。独自のMakefileやプロジェクトファイルでコンパイルしたときのトラブルを軽減します。
    • Windows版において、コンパイル時に以下のマクロが設定されていない場合に警告メッセージを表示します。
      • WIN32_LEAN_AND_MEAN, NOMINMAX, _USE_MATH_DEFINES
    • Windows版/Cygwin版/Linux版において、コンパイル時に以下のマクロが設定されていない場合に警告メッセージを表示します。
      • __STDC_LIMIT_MACROS, __STDC_CONSTANT_MACROS, __STDC_FORMAT_MACROS
  • Windows環境において、nlib_sockのtypedefをSOCKET型からint型に変更しました。
  • simdライブラリのNEON用コードを実際のARMアーキテクチャ用クロスコンパイラ(gcc 4.9)でビルドできるようにしました。
    • 現在のところ動作テストにはIntel社より配布されているNEONvsSSE_6.hを用いています。
  • simdライブラリのコードにAArch64向けのコードを追加しました。
  • nlibのセットアップについての説明を改善しました。
  • FAQを追加しました。
  • nn::nlib::unicode名前空間内のいくつかの関数をdeprecatedにしました。将来のリリースで削除されます。
    • nn::nlib::unicode::ToUtf32(), nn::nlib::unicode::ToUtf16(), nn::nlib::unicode::ToUtf8()
    • nn::nlib::unicode::Utf32ToUtf8(), nn::nlib::unicode::Utf16ToUtf8(), nn::nlib::unicode::WideToUtf8()
    • nn::nlib::unicode::Utf8ToUtf32(), nn::nlib::unicode::Utf8ToUtf16(), nn::nlib::unicode::Utf8ToWide()
  • いくつかのヘッダファイルや関数等の削除
    • miscライブラリからnn/nlib/threading/SimpleRingBuffer.hを削除しました。
    • miscライブラリからnn/nlib/threading/Interlocked.hを削除しました。今後はnlib_atomic32_increment()等のCリンケージの関数を直接ご利用ください。
    • miscライブラリからnn/nlib/threading/CallOnce.hを削除しました。
      • nn::nlib::threading::CallOnce(), nn::nlib::threading::TryCallOnce()等を削除しました。今後は nlib_once(), nlib_tryonce()等のCリンケージの関数を直接ご利用ください。
    • NLIB_PRINTFマクロ, NLIB_VSNPRINTFマクロ, NLIB_VSNWPRINTFマクロを削除しました。
    • NLIB_ATTRIBUTE_ALIGNマクロを削除しました。今後はNLIB_ALIGNASマクロに統一されます。
    • nn::nlib::StrEqual(), nn::nlib::StrNEqual()を削除しました。strcmp(), nn::nlib::StrCmp()等を直接ご利用ください。
  • いくつかのサンプルの見直し
  • NLIB_MEMORY_ORDER_RELEASE, NLIB_MEMORY_ORDER_ACQUIRE, NLIB_MEMORY_ORDER_ACQ_REL の更新
    • C++11が利用できる場合、atomic_thread_fence()を利用します。
    • Win32版で_WriteBarrier()等の最適化バリアが追加されました。最適化による一部不具合を解消します。
    • CTR版では DataSynchronizationBarrier() と最適化バリアを組み合わせたものを実行します。
  • その他細かい変更と修正

2014-08-04

  • simdライブラリがCAFEのpaired singleに対応しました。単精度浮動小数点数を用いる計算にpaired singleが用いられるようになりました。
    • 4次元ベクトル等の128bitデータを値返しするI/FのためCAFE-SDKの行列計算等の関数より「かなり」遅いことに注意してください。
    • SSE4.1/NEONでは128bitデータはXMMレジスタ等の128bitレジスタに格納されて値返しされるため最適な方法となります。
  • simdライブラリにクラスと関数が追加されました。
    • Frustumクラスの追加。
    • Frustumとジオメトリの交差判定・包含判定の追加。
  • CTRでnlib_init_ctrsample()がRomFs用のバッファを動的に確保するように変更しました。
  • exiライブラリ(Text xml parser)のトークナイザがXML属性用に確保するバッファの初期サイズを調整しました。
  • Win32環境でUNICODE, _UNICODEマクロの定義を行わないように変更しました。nlibはこれらのマクロ定義の有無に依存しません。
  • Win32環境でWINVERマクロの値をチェックするように変更しました。
  • リファレンス・マニュアルにビルド環境等の構築の自動化手法についての紹介を追加しました。
    • Windows用のパッケージ管理ツール「chocolatey」についての説明を追加しました。chocolateyを用いることによってWindowsプログラム開発のためのビルド環境の整備をある程度自動化することができます。
    • cygwin用のパッケージ管理ツール「apt-cyg」についての説明を追加しました。apt-cygを用いることによってcygwinプログラム開発のためのビルド環境の整備をある程度自動化することができます。
  • Windows, cygwinでnlibを利用するための環境設定方法の説明を改善しました。
  • nlib_strcplen(), nlib_strcplen_ex()のSIMD命令を利用するバージョンで、文字列がページ境界(4096バイト境界)直前で終端する文字列の場合に正しく動作しないあるバグの修正。
  • その他細かい変更と修正
こちらに 過去のChangelogs があります。